diff --git a/hscontrol/policy/v2/tailscale_compat_test.go b/hscontrol/policy/v2/tailscale_acl_compat_test.go similarity index 99% rename from hscontrol/policy/v2/tailscale_compat_test.go rename to hscontrol/policy/v2/tailscale_acl_compat_test.go index ac72cae2..580e1de4 100644 --- a/hscontrol/policy/v2/tailscale_compat_test.go +++ b/hscontrol/policy/v2/tailscale_acl_compat_test.go @@ -13,6 +13,7 @@ // and improve our policy implementation. // This file is NOT intended for developer/humans to change and should be // consider a "black box" test suite. + package v2 import ( diff --git a/hscontrol/policy/v2/tailscale_grants_compat_test.go b/hscontrol/policy/v2/tailscale_grants_compat_test.go new file mode 100644 index 00000000..a25f4df6 --- /dev/null +++ b/hscontrol/policy/v2/tailscale_grants_compat_test.go @@ -0,0 +1,897 @@ +// This file is "generated" by Claude. +// It contains a data-driven test that reads 237 GRANT-*.json test files +// captured from Tailscale SaaS. Each file contains: +// - A policy with grants (and optionally ACLs) +// - The expected packet_filter_rules for each of 8 test nodes +// - Or an error response for invalid policies +// +// The test loads each JSON file, applies the policy through headscale's +// grants engine, and compares the output against Tailscale's actual behavior. +// +// Tests that are known to fail due to unimplemented features or known +// differences are skipped with a TODO comment explaining the root cause. +// As headscale's grants implementation improves, tests should be removed +// from the skip list. +// +// Test data source: testdata/grant_results/GRANT-*.json +// Captured from: Tailscale SaaS API + tailscale debug localapi + +package v2 + +import ( + "encoding/json" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/juanfont/headscale/hscontrol/policy/policyutil" + "github.com/juanfont/headscale/hscontrol/types" + "github.com/stretchr/testify/require" + "gorm.io/gorm" + "tailscale.com/tailcfg" +) + +// grantTestFile represents the JSON structure of a captured grant test file. +type grantTestFile struct { + TestID string `json:"test_id"` + Error bool `json:"error"` + Input struct { + FullPolicy json.RawMessage `json:"full_policy"` + APIResponseCode int `json:"api_response_code"` + APIResponseBody *struct { + Message string `json:"message"` + } `json:"api_response_body"` + } `json:"input"` + Topology struct { + Nodes map[string]struct { + Hostname string `json:"hostname"` + Tags []string `json:"tags"` + IPv4 string `json:"ipv4"` + IPv6 string `json:"ipv6"` + } `json:"nodes"` + } `json:"topology"` + Captures map[string]struct { + PacketFilterRules json.RawMessage `json:"packet_filter_rules"` + } `json:"captures"` +} + +// setupGrantsCompatUsers returns the 3 test users for grants compatibility tests. +// Email addresses use @example.com domain, matching the converted Tailscale policy format. +func setupGrantsCompatUsers() types.Users { + return types.Users{ + {Model: gorm.Model{ID: 1}, Name: "kratail2tid", Email: "kratail2tid@example.com"}, + {Model: gorm.Model{ID: 2}, Name: "kristoffer", Email: "kristoffer@example.com"}, + {Model: gorm.Model{ID: 3}, Name: "monitorpasskeykradalby", Email: "monitorpasskeykradalby@example.com"}, + } +} + +// setupGrantsCompatNodes returns the 8 test nodes for grants compatibility tests. +// The node configuration matches the Tailscale test environment: +// - 3 user-owned nodes (user1, user-kris, user-mon) +// - 5 tagged nodes (tagged-server, tagged-prod, tagged-client, subnet-router, exit-node) +func setupGrantsCompatNodes(users types.Users) types.Nodes { + nodeUser1 := &types.Node{ + ID: 1, + GivenName: "user1", + User: &users[0], + UserID: &users[0].ID, + IPv4: ptrAddr("100.90.199.68"), + IPv6: ptrAddr("fd7a:115c:a1e0::2d01:c747"), + Hostinfo: &tailcfg.Hostinfo{}, + } + + nodeUserKris := &types.Node{ + ID: 2, + GivenName: "user-kris", + User: &users[1], + UserID: &users[1].ID, + IPv4: ptrAddr("100.110.121.96"), + IPv6: ptrAddr("fd7a:115c:a1e0::1737:7960"), + Hostinfo: &tailcfg.Hostinfo{}, + } + + nodeUserMon := &types.Node{ + ID: 3, + GivenName: "user-mon", + User: &users[2], + UserID: &users[2].ID, + IPv4: ptrAddr("100.103.90.82"), + IPv6: ptrAddr("fd7a:115c:a1e0::9e37:5a52"), + Hostinfo: &tailcfg.Hostinfo{}, + } + + nodeTaggedServer := &types.Node{ + ID: 4, + GivenName: "tagged-server", + IPv4: ptrAddr("100.108.74.26"), + IPv6: ptrAddr("fd7a:115c:a1e0::b901:4a87"), + Tags: []string{"tag:server"}, + Hostinfo: &tailcfg.Hostinfo{}, + } + + nodeTaggedProd := &types.Node{ + ID: 5, + GivenName: "tagged-prod", + IPv4: ptrAddr("100.103.8.15"), + IPv6: ptrAddr("fd7a:115c:a1e0::5b37:80f"), + Tags: []string{"tag:prod"}, + Hostinfo: &tailcfg.Hostinfo{}, + } + + nodeTaggedClient := &types.Node{ + ID: 6, + GivenName: "tagged-client", + IPv4: ptrAddr("100.83.200.69"), + IPv6: ptrAddr("fd7a:115c:a1e0::c537:c845"), + Tags: []string{"tag:client"}, + Hostinfo: &tailcfg.Hostinfo{}, + } + + nodeSubnetRouter := &types.Node{ + ID: 7, + GivenName: "subnet-router", + IPv4: ptrAddr("100.92.142.61"), + IPv6: ptrAddr("fd7a:115c:a1e0::3e37:8e3d"), + Tags: []string{"tag:router"}, + Hostinfo: &tailcfg.Hostinfo{}, + } + + nodeExitNode := &types.Node{ + ID: 8, + GivenName: "exit-node", + IPv4: ptrAddr("100.85.66.106"), + IPv6: ptrAddr("fd7a:115c:a1e0::7c37:426a"), + Tags: []string{"tag:exit"}, + Hostinfo: &tailcfg.Hostinfo{}, + } + + return types.Nodes{ + nodeUser1, + nodeUserKris, + nodeUserMon, + nodeTaggedServer, + nodeTaggedProd, + nodeTaggedClient, + nodeSubnetRouter, + nodeExitNode, + } +} + +// findGrantsNode finds a node by its GivenName in the grants test environment. +func findGrantsNode(nodes types.Nodes, name string) *types.Node { + for _, n := range nodes { + if n.GivenName == name { + return n + } + } + + return nil +} + +// convertPolicyUserEmails converts Tailscale SaaS user email formats to +// headscale-compatible @example.com format in the raw policy JSON. +// +// Tailscale uses provider-specific email formats: +// - kratail2tid@passkey (passkey auth) +// - kristoffer@dalby.cc (email auth) +// - monitorpasskeykradalby@passkey (passkey auth) +// +// Headscale resolves users by Email field, so we convert all to @example.com. +func convertPolicyUserEmails(policyJSON []byte) []byte { + s := string(policyJSON) + s = strings.ReplaceAll(s, "kratail2tid@passkey", "kratail2tid@example.com") + s = strings.ReplaceAll(s, "kristoffer@dalby.cc", "kristoffer@example.com") + s = strings.ReplaceAll(s, "monitorpasskeykradalby@passkey", "monitorpasskeykradalby@example.com") + + return []byte(s) +} + +// loadGrantTestFile loads and parses a single grant test JSON file. +func loadGrantTestFile(t *testing.T, path string) grantTestFile { + t.Helper() + + content, err := os.ReadFile(path) + require.NoError(t, err, "failed to read test file %s", path) + + var tf grantTestFile + + err = json.Unmarshal(content, &tf) + require.NoError(t, err, "failed to parse test file %s", path) + + return tf +} + +// Skip categories document WHY tests are expected to fail and WHAT needs to be +// implemented to fix them. Tests are grouped by root cause to identify high-impact +// changes. +// +// Impact summary (highest first): +// +// SRCIPS_FORMAT - 125 tests: Fix SrcIPs to use CGNAT split ranges +// CAPGRANT_COMPILATION - 41 tests: Implement app->CapGrant FilterRule compilation +// ERROR_VALIDATION_GAP - 14 tests: Implement missing grant validation rules +// CAPGRANT_AND_SRCIPS_FORMAT - 9 tests: Both CapGrant compilation + SrcIPs format +// VIA_AND_SRCIPS_FORMAT - 4 tests: Via route compilation + SrcIPs format +// AUTOGROUP_DANGER_ALL - 3 tests: Implement autogroup:danger-all support +// VALIDATION_STRICTNESS - 2 tests: headscale too strict (rejects what Tailscale accepts) +// +// Total: 193 tests skipped, 19 tests expected to pass. +var grantSkipReasons = map[string]string{ + // ======================================================================== + // SRCIPS_FORMAT (125 tests) + // + // TODO: Implement CGNAT split range generation for SrcIPs. + // + // headscale currently generates ["100.64.0.0/10", "fd7a:115c:a1e0::/48"] + // for wildcard source matches. Tailscale generates split CGNAT ranges that + // exclude the ChromeOS VM range 100.115.92.0/23, and includes advertised + // subnet routes (e.g., "10.33.0.0/16") in the SrcIPs list. + // + // Additionally, headscale uses CIDR notation for host IPs in DstPorts + // (e.g., "100.108.74.26/32") while Tailscale uses bare IPs + // (e.g., "100.108.74.26"). + // + // Fixing SrcIPs generation and DstPorts IP format would resolve all 125 + // tests in this category. + // ======================================================================== + + // J-series: Protocol-specific IP grants + "GRANT-J1": "SRCIPS_FORMAT", + "GRANT-J2": "SRCIPS_FORMAT", + "GRANT-J3": "SRCIPS_FORMAT", + "GRANT-J4": "SRCIPS_FORMAT", + "GRANT-J5": "SRCIPS_FORMAT", + "GRANT-J6": "SRCIPS_FORMAT", + + // K-series: Various IP grant patterns + "GRANT-K1": "SRCIPS_FORMAT", + "GRANT-K2": "SRCIPS_FORMAT", + "GRANT-K4": "SRCIPS_FORMAT", + "GRANT-K14": "SRCIPS_FORMAT", + "GRANT-K15": "SRCIPS_FORMAT", + "GRANT-K16": "SRCIPS_FORMAT", + "GRANT-K17": "SRCIPS_FORMAT", + "GRANT-K20": "SRCIPS_FORMAT", + "GRANT-K21": "SRCIPS_FORMAT", + "GRANT-K22": "SRCIPS_FORMAT", + "GRANT-K26": "SRCIPS_FORMAT", + + // P01-series: Wildcard and basic IP grants + "GRANT-P01_1": "SRCIPS_FORMAT", + "GRANT-P01_2": "SRCIPS_FORMAT", + "GRANT-P01_3": "SRCIPS_FORMAT", + "GRANT-P01_4": "SRCIPS_FORMAT", + + // P02-series: Source targeting (user, group, tag) + "GRANT-P02_1": "SRCIPS_FORMAT", + "GRANT-P02_2": "SRCIPS_FORMAT", + "GRANT-P02_3": "SRCIPS_FORMAT", + "GRANT-P02_4": "SRCIPS_FORMAT", + "GRANT-P02_5_CORRECT": "SRCIPS_FORMAT", + "GRANT-P02_5_NAIVE": "SRCIPS_FORMAT", + + // P03-series: Destination targeting + "GRANT-P03_1": "SRCIPS_FORMAT", + "GRANT-P03_2": "SRCIPS_FORMAT", + "GRANT-P03_3": "SRCIPS_FORMAT", + "GRANT-P03_4": "SRCIPS_FORMAT", + + // P04-series: autogroup:member grants + "GRANT-P04_1": "SRCIPS_FORMAT", + "GRANT-P04_2": "SRCIPS_FORMAT", + + // P05-series: Tag-to-tag grants + "GRANT-P05_1": "SRCIPS_FORMAT", + "GRANT-P05_2": "SRCIPS_FORMAT", + "GRANT-P05_3": "SRCIPS_FORMAT", + + // P06-series: IP protocol grants + "GRANT-P06_1": "SRCIPS_FORMAT", + "GRANT-P06_2": "SRCIPS_FORMAT", + "GRANT-P06_3": "SRCIPS_FORMAT", + "GRANT-P06_4": "SRCIPS_FORMAT", + "GRANT-P06_5": "SRCIPS_FORMAT", + "GRANT-P06_6": "SRCIPS_FORMAT", + "GRANT-P06_7": "SRCIPS_FORMAT", + + // P08-series: Multiple grants / rule merging + "GRANT-P08_1": "SRCIPS_FORMAT", + "GRANT-P08_2": "SRCIPS_FORMAT", + "GRANT-P08_4": "SRCIPS_FORMAT", + "GRANT-P08_5": "SRCIPS_FORMAT", + "GRANT-P08_6": "SRCIPS_FORMAT", + "GRANT-P08_7": "SRCIPS_FORMAT", + "GRANT-P08_8": "SRCIPS_FORMAT", + + // P09-series: ACL-to-grant conversion equivalence tests + "GRANT-P09_1A": "SRCIPS_FORMAT", + "GRANT-P09_1B": "SRCIPS_FORMAT", + "GRANT-P09_1C": "SRCIPS_FORMAT", + "GRANT-P09_1D": "SRCIPS_FORMAT", + "GRANT-P09_1E": "SRCIPS_FORMAT", + "GRANT-P09_2A_CORRECT": "SRCIPS_FORMAT", + "GRANT-P09_2A_NAIVE": "SRCIPS_FORMAT", + "GRANT-P09_2B_CORRECT": "SRCIPS_FORMAT", + "GRANT-P09_2B_NAIVE": "SRCIPS_FORMAT", + "GRANT-P09_2C": "SRCIPS_FORMAT", + "GRANT-P09_3A": "SRCIPS_FORMAT", + "GRANT-P09_3B": "SRCIPS_FORMAT", + "GRANT-P09_3C": "SRCIPS_FORMAT", + "GRANT-P09_4A": "SRCIPS_FORMAT", + "GRANT-P09_4B": "SRCIPS_FORMAT", + "GRANT-P09_4C": "SRCIPS_FORMAT", + "GRANT-P09_4D": "SRCIPS_FORMAT", + "GRANT-P09_4E": "SRCIPS_FORMAT", + "GRANT-P09_4F": "SRCIPS_FORMAT", + "GRANT-P09_4G": "SRCIPS_FORMAT", + "GRANT-P09_5A": "SRCIPS_FORMAT", + "GRANT-P09_5B": "SRCIPS_FORMAT", + "GRANT-P09_5C_NAIVE": "SRCIPS_FORMAT", + "GRANT-P09_6A": "SRCIPS_FORMAT", + "GRANT-P09_6C": "SRCIPS_FORMAT", + "GRANT-P09_6D": "SRCIPS_FORMAT", + "GRANT-P09_7A": "SRCIPS_FORMAT", + "GRANT-P09_7B_NAIVE": "SRCIPS_FORMAT", + "GRANT-P09_7C": "SRCIPS_FORMAT", + "GRANT-P09_7D_NAIVE": "SRCIPS_FORMAT", + "GRANT-P09_8A": "SRCIPS_FORMAT", + "GRANT-P09_8B": "SRCIPS_FORMAT", + "GRANT-P09_8C": "SRCIPS_FORMAT", + "GRANT-P09_9A": "SRCIPS_FORMAT", + "GRANT-P09_9B": "SRCIPS_FORMAT", + "GRANT-P09_9C": "SRCIPS_FORMAT", + "GRANT-P09_10A": "SRCIPS_FORMAT", + "GRANT-P09_10B": "SRCIPS_FORMAT", + "GRANT-P09_10C": "SRCIPS_FORMAT", + "GRANT-P09_10D": "SRCIPS_FORMAT", + "GRANT-P09_11A": "SRCIPS_FORMAT", + "GRANT-P09_11B": "SRCIPS_FORMAT", + "GRANT-P09_11C_NAIVE": "SRCIPS_FORMAT", + "GRANT-P09_11D": "SRCIPS_FORMAT", + "GRANT-P09_12A": "SRCIPS_FORMAT", + "GRANT-P09_12B": "SRCIPS_FORMAT", + "GRANT-P09_13E": "SRCIPS_FORMAT", + "GRANT-P09_13F": "SRCIPS_FORMAT", + "GRANT-P09_13G": "SRCIPS_FORMAT", + "GRANT-P09_14A": "SRCIPS_FORMAT", + "GRANT-P09_14B": "SRCIPS_FORMAT", + "GRANT-P09_14C": "SRCIPS_FORMAT", + "GRANT-P09_14D": "SRCIPS_FORMAT", + "GRANT-P09_14E": "SRCIPS_FORMAT", + "GRANT-P09_14F": "SRCIPS_FORMAT", + "GRANT-P09_14G": "SRCIPS_FORMAT", + "GRANT-P09_14H": "SRCIPS_FORMAT", + "GRANT-P09_14I": "SRCIPS_FORMAT", + + // P10-series: Host alias grants + "GRANT-P10_1": "SRCIPS_FORMAT", + "GRANT-P10_2": "SRCIPS_FORMAT", + "GRANT-P10_3": "SRCIPS_FORMAT", + "GRANT-P10_4": "SRCIPS_FORMAT", + + // P11-series: autogroup:tagged grants + "GRANT-P11_1": "SRCIPS_FORMAT", + "GRANT-P11_2": "SRCIPS_FORMAT", + + // P13-series: CIDR destination grants + "GRANT-P13_1": "SRCIPS_FORMAT", + "GRANT-P13_2": "SRCIPS_FORMAT", + "GRANT-P13_3": "SRCIPS_FORMAT", + "GRANT-P13_4": "SRCIPS_FORMAT", + + // P15-series: Empty/no-match grants + "GRANT-P15_1": "SRCIPS_FORMAT", + "GRANT-P15_3": "SRCIPS_FORMAT", + + // ======================================================================== + // CAPGRANT_COMPILATION (49 tests) + // + // TODO: Implement app capability grant -> CapGrant FilterRule compilation. + // + // When a grant specifies an "app" field (application capabilities), it + // should produce a FilterRule with CapGrant entries instead of DstPorts. + // headscale currently does not compile app grants into CapGrant FilterRules, + // producing empty output where Tailscale produces CapGrant rules. + // + // Each CapGrant FilterRule contains: + // - SrcIPs: source IP ranges (same format as DstPorts rules) + // - CapGrant: []tailcfg.CapGrant with Dsts (destination IPs) and + // CapMap (capability name -> JSON values) + // + // Fixing CapGrant compilation would resolve all 41 tests in this category. + // ======================================================================== + + // A-series: Basic app capability grants + "GRANT-A1": "CAPGRANT_COMPILATION", + "GRANT-A3": "CAPGRANT_COMPILATION", + "GRANT-A4": "CAPGRANT_COMPILATION", + "GRANT-A6": "CAPGRANT_COMPILATION", + + // B-series: Specific capability types (kubernetes, drive, etc.) + "GRANT-B1": "CAPGRANT_COMPILATION", + "GRANT-B2": "CAPGRANT_COMPILATION", + "GRANT-B3": "CAPGRANT_COMPILATION", + "GRANT-B4": "CAPGRANT_COMPILATION", + "GRANT-B5": "CAPGRANT_COMPILATION", + + // C-series: Capability values and multiple caps + "GRANT-C1": "CAPGRANT_COMPILATION", + "GRANT-C2": "CAPGRANT_COMPILATION", + "GRANT-C3": "CAPGRANT_COMPILATION", + "GRANT-C4": "CAPGRANT_COMPILATION", + "GRANT-C5": "CAPGRANT_COMPILATION", + "GRANT-C6": "CAPGRANT_COMPILATION", + + // D-series: Source targeting with app caps + "GRANT-D1": "CAPGRANT_COMPILATION", + "GRANT-D2": "CAPGRANT_COMPILATION", + "GRANT-D3": "CAPGRANT_COMPILATION", + "GRANT-D4": "CAPGRANT_COMPILATION", + "GRANT-D5": "CAPGRANT_COMPILATION", + "GRANT-D6": "CAPGRANT_COMPILATION", + "GRANT-D7": "CAPGRANT_COMPILATION", + + // E-series: Destination targeting with app caps + "GRANT-E1": "CAPGRANT_COMPILATION", + "GRANT-E2": "CAPGRANT_COMPILATION", + "GRANT-E4": "CAPGRANT_COMPILATION", + "GRANT-E5": "CAPGRANT_COMPILATION", + "GRANT-E6": "CAPGRANT_COMPILATION", + "GRANT-E7": "CAPGRANT_COMPILATION", + "GRANT-E8": "CAPGRANT_COMPILATION", + + // G-series: Group-based source with app caps (pure capgrant) + "GRANT-G1": "CAPGRANT_COMPILATION", + "GRANT-G2": "CAPGRANT_COMPILATION", + "GRANT-G3": "CAPGRANT_COMPILATION", + "GRANT-G6": "CAPGRANT_COMPILATION", + + // H-series: Edge cases with app caps + "GRANT-H2": "CAPGRANT_COMPILATION", + "GRANT-H6": "CAPGRANT_COMPILATION", + + // K-series: Various app cap patterns + "GRANT-K11": "CAPGRANT_COMPILATION", + "GRANT-K18": "CAPGRANT_COMPILATION", + "GRANT-K19": "CAPGRANT_COMPILATION", + "GRANT-K24": "CAPGRANT_COMPILATION", + "GRANT-K25": "CAPGRANT_COMPILATION", + "GRANT-K27": "CAPGRANT_COMPILATION", + + // V-series: App caps on specific tags, drive cap, autogroup:self app + "GRANT-V02": "CAPGRANT_COMPILATION: app grant on tag:exit — CapGrant with exit-node IPs as Dsts not compiled", + "GRANT-V03": "CAPGRANT_COMPILATION: app grant on tag:router — CapGrant with router IPs as Dsts not compiled", + "GRANT-V06": "CAPGRANT_COMPILATION: multi-dst app grant on [tag:server, tag:exit] — per-node CapGrant not compiled", + "GRANT-V19": "CAPGRANT_COMPILATION: drive cap on tag:exit — drive CapGrant + reverse drive-sharer not compiled", + "GRANT-V20": "CAPGRANT_COMPILATION: kubernetes cap on tag:router — CapGrant not compiled", + "GRANT-V25": "CAPGRANT_COMPILATION: autogroup:self app grant — self-targeting CapGrant per member not compiled", + + // ======================================================================== + // CAPGRANT_COMPILATION_AND_SRCIPS_FORMAT (11 tests) + // + // TODO: These tests have BOTH DstPorts and CapGrant FilterRules. + // They require both CapGrant compilation AND SrcIPs format fixes. + // Grants with both "ip" and "app" fields produce two separate FilterRules: + // one with DstPorts (from "ip") and one with CapGrant (from "app"). + // + // V09/V10: headscale currently rejects mixed ip+app grants with + // "grants cannot specify both 'ip' and 'app' fields", but Tailscale + // accepts them and produces two FilterRules per grant. + // ======================================================================== + + // F-series: Mixed ip+app grants + "GRANT-F1": "CAPGRANT_COMPILATION_AND_SRCIPS_FORMAT", + "GRANT-F2": "CAPGRANT_COMPILATION_AND_SRCIPS_FORMAT", + "GRANT-F3": "CAPGRANT_COMPILATION_AND_SRCIPS_FORMAT", + "GRANT-F4": "CAPGRANT_COMPILATION_AND_SRCIPS_FORMAT", + + // G-series: Group-based mixed grants + "GRANT-G4": "CAPGRANT_COMPILATION_AND_SRCIPS_FORMAT", + "GRANT-G5": "CAPGRANT_COMPILATION_AND_SRCIPS_FORMAT", + + // K-series: Mixed patterns + "GRANT-K3": "CAPGRANT_COMPILATION_AND_SRCIPS_FORMAT", + "GRANT-K5": "CAPGRANT_COMPILATION_AND_SRCIPS_FORMAT", + "GRANT-K28": "CAPGRANT_COMPILATION_AND_SRCIPS_FORMAT", + + // V-series: Mixed ip+app on specific tags + "GRANT-V09": "CAPGRANT_COMPILATION_AND_SRCIPS_FORMAT: mixed ip+app on tag:exit — headscale rejects, Tailscale produces DstPorts + CapGrant", + "GRANT-V10": "CAPGRANT_COMPILATION_AND_SRCIPS_FORMAT: mixed ip+app on tag:router — headscale rejects, Tailscale produces DstPorts + CapGrant", + + // ======================================================================== + // VIA_COMPILATION (3 tests) + // + // TODO: Implement via route compilation in filter rules. + // + // Via routes with specific (non-wildcard) sources produce DstPorts rules + // with correctly restricted SrcIPs. These tests have no SrcIPs format + // issue because they use specific src identities (tags, groups, members). + // ======================================================================== + "GRANT-V11": "VIA_COMPILATION: via tag:router + src:tag:client — SrcIPs = client IPs only", + "GRANT-V12": "VIA_COMPILATION: via tag:router + src:autogroup:member — SrcIPs = member IPs", + "GRANT-V13": "VIA_COMPILATION: via tag:router + src:group:developers + tcp:80,443 — group SrcIPs + specific ports", + + // ======================================================================== + // VIA_COMPILATION_AND_SRCIPS_FORMAT (7 tests) + // + // TODO: Implement via route compilation in filter rules. + // + // Via routes ("via" field in grants) specify that traffic to a destination + // CIDR should be routed through a specific tagged subnet router. The via + // field is currently parsed and validated but NOT compiled into FilterRules. + // + // These tests also have SrcIPs format differences (wildcard src expands + // to split CGNAT ranges). + // ======================================================================== + "GRANT-I1": "VIA_COMPILATION_AND_SRCIPS_FORMAT", + "GRANT-I2": "VIA_COMPILATION_AND_SRCIPS_FORMAT", + "GRANT-I3": "VIA_COMPILATION_AND_SRCIPS_FORMAT", + "GRANT-K13": "VIA_COMPILATION_AND_SRCIPS_FORMAT", + "GRANT-V17": "VIA_COMPILATION_AND_SRCIPS_FORMAT: via tag:router + multi-dst — unadvertised subnets silently dropped", + "GRANT-V21": "VIA_COMPILATION_AND_SRCIPS_FORMAT: via [tag:router, tag:exit] — only advertising nodes get rules", + "GRANT-V23": "VIA_COMPILATION_AND_SRCIPS_FORMAT: via tag:router + tcp:22,80,443 — via + multiple ports", + + // ======================================================================== + // AUTOGROUP_DANGER_ALL (3 tests) + // + // TODO: Implement autogroup:danger-all support. + // + // autogroup:danger-all matches ALL IPs including non-Tailscale addresses. + // When used as a source, it should expand to 0.0.0.0/0 and ::/0. + // When used as a destination, Tailscale rejects it with an error. + // + // GRANT-K6: autogroup:danger-all as src (success test, produces rules) + // GRANT-K7: autogroup:danger-all as dst (error: "cannot use autogroup:danger-all as a dst") + // GRANT-K8: autogroup:danger-all as both src and dst (error: same message) + // ======================================================================== + "GRANT-K6": "AUTOGROUP_DANGER_ALL", + "GRANT-K7": "AUTOGROUP_DANGER_ALL", + "GRANT-K8": "AUTOGROUP_DANGER_ALL", + + // ======================================================================== + // ERROR_VALIDATION_GAP (23 tests) + // + // TODO: Implement grant validation rules that Tailscale enforces but + // headscale does not yet. + // + // These are policies that Tailscale rejects (api_response_code=400) but + // headscale currently accepts without error. Each test documents the + // specific validation that needs to be added. + // ======================================================================== + + // Capability name format validation: + // Tailscale requires cap names to be {domain}/{path} without https:// prefix + // and rejects caps in the tailscale.com domain. + "GRANT-A2": "ERROR_VALIDATION_GAP: capability name must have the form {domain}/{path} — headscale should reject https:// prefix in cap names", + "GRANT-A5": "ERROR_VALIDATION_GAP: capability name must not be in the tailscale.com domain — headscale should reject tailscale.com/cap/relay-target", + "GRANT-K9": "ERROR_VALIDATION_GAP: capability name must not be in the tailscale.com domain — headscale should reject tailscale.com/cap/ingress", + "GRANT-K10": "ERROR_VALIDATION_GAP: capability name must not be in the tailscale.com domain — headscale should reject tailscale.com/cap/funnel", + + // autogroup:self validation: + // Tailscale only allows autogroup:self as dst when src is a user, group, + // or supported autogroup (like autogroup:member). It rejects autogroup:self + // when src is "*" (which includes tags) or when src is a tag. + "GRANT-E3": "ERROR_VALIDATION_GAP: autogroup:self can only be used with users, groups, or supported autogroups — src=[*] includes tags", + "GRANT-H9": "ERROR_VALIDATION_GAP: autogroup:self can only be used with users, groups, or supported autogroups — src=[*] includes tags", + "GRANT-P04_3": "ERROR_VALIDATION_GAP: autogroup:self can only be used with users, groups, or supported autogroups — src=[*] with ip grant", + "GRANT-P09_13A": "ERROR_VALIDATION_GAP: autogroup:self can only be used with users, groups, or supported autogroups — src=[*] with ip:[*]", + "GRANT-P09_13B": "ERROR_VALIDATION_GAP: autogroup:self can only be used with users, groups, or supported autogroups — src=[*] with ip:[22]", + "GRANT-P09_13C": "ERROR_VALIDATION_GAP: autogroup:self can only be used with users, groups, or supported autogroups — src=[*] with ip:[22,80,443]", + "GRANT-P09_13D": "ERROR_VALIDATION_GAP: autogroup:self can only be used with users, groups, or supported autogroups — src=[*] with ip:[80-443]", + "GRANT-P09_13H_CORRECT": "ERROR_VALIDATION_GAP: autogroup:self can only be used with users, groups, or supported autogroups — multi-grant with self", + "GRANT-P09_13H_NAIVE": "ERROR_VALIDATION_GAP: autogroup:self can only be used with users, groups, or supported autogroups — naive multi-dst with self", + + // Via route validation: + // Tailscale requires "via" to be a tag, rejects other values. + "GRANT-I4": "ERROR_VALIDATION_GAP: via can only be a tag — headscale should reject non-tag via values", + + // autogroup:internet + app grants validation: + // Tailscale rejects app grants when dst includes autogroup:internet. + "GRANT-V01": "ERROR_VALIDATION_GAP: cannot use app grants with autogroup:internet — headscale does not reject", + "GRANT-V22": "ERROR_VALIDATION_GAP: cannot use app grants with autogroup:internet — headscale returns different error (rejects mixed ip+app instead)", + + // Raw default route CIDR validation: + // Tailscale rejects 0.0.0.0/0 and ::/0 as grant dst, requiring "*" or + // "autogroup:internet" instead. This applies with or without via. + "GRANT-V04": "ERROR_VALIDATION_GAP: dst 0.0.0.0/0 rejected — headscale should reject raw default route CIDRs in grant dst", + "GRANT-V05": "ERROR_VALIDATION_GAP: dst ::/0 rejected — headscale should reject raw default route CIDRs in grant dst", + "GRANT-V08": "ERROR_VALIDATION_GAP: dst 0.0.0.0/0 with ip grant — same rejection as V04", + "GRANT-V14": "ERROR_VALIDATION_GAP: dst 0.0.0.0/0 with via — rejected even with via field", + "GRANT-V15": "ERROR_VALIDATION_GAP: dst ::/0 with via — rejected even with via field", + "GRANT-V16": "ERROR_VALIDATION_GAP: dst [0.0.0.0/0, ::/0] with via — both rejected", + "GRANT-V18": "ERROR_VALIDATION_GAP: dst 0.0.0.0/0 with via + app — rejected regardless of via or app", + + // Empty src/dst validation difference: + // Tailscale ACCEPTS empty src/dst arrays (producing no filter rules), + // but headscale rejects them with "grant sources/destinations cannot be empty". + // headscale is stricter here — should match Tailscale and accept empty arrays. + "GRANT-H4": "VALIDATION_STRICTNESS: headscale rejects empty src=[] but Tailscale accepts it (producing no rules)", + "GRANT-H5": "VALIDATION_STRICTNESS: headscale rejects empty dst=[] but Tailscale accepts it (producing no rules)", + + // ======================================================================== + // NIL_VS_EMPTY_RULES (varies) + // + // TODO: headscale returns empty []FilterRule{} where Tailscale returns null. + // + // Some success tests have null packet_filter_rules for online nodes, + // meaning Tailscale determined no rules apply. headscale may still produce + // empty-but-non-nil results due to how filter compilation works. + // These are handled by cmpopts.EquateEmpty() in the comparison, so they + // should no longer fail. If they still fail, the specific test needs + // investigation. + // ======================================================================== +} + +// TestGrantsCompat is a data-driven test that loads all 237 GRANT-*.json +// test files captured from Tailscale SaaS and compares headscale's grants +// engine output against the real Tailscale behavior. +// +// Each JSON file contains: +// - A full policy (groups, tagOwners, hosts, autoApprovers, grants, optionally acls) +// - For success cases: expected packet_filter_rules per node (8 nodes) +// - For error cases: expected error message +// +// The test converts Tailscale user email formats (@passkey, @dalby.cc) to +// headscale format (@example.com) and runs the policy through unmarshalPolicy, +// validate, compileFilterRulesForNode, and ReduceFilterRules. +// +// Skip category impact summary (highest first): +// +// SRCIPS_FORMAT - 125 tests: Fix SrcIPs to use CGNAT split ranges +// CAPGRANT_COMPILATION - 41 tests: Implement app->CapGrant FilterRule compilation +// ERROR_VALIDATION_GAP - 14 tests: Implement missing grant validation rules +// CAPGRANT_AND_SRCIPS_FORMAT - 9 tests: Both CapGrant compilation + SrcIPs format +// VIA_AND_SRCIPS_FORMAT - 4 tests: Via route compilation + SrcIPs format +// AUTOGROUP_DANGER_ALL - 3 tests: Implement autogroup:danger-all support +// VALIDATION_STRICTNESS - 2 tests: headscale too strict (rejects what Tailscale accepts) +// +// Total: 193 tests skipped, 19 tests expected to pass. +func TestGrantsCompat(t *testing.T) { + t.Parallel() + + files, err := filepath.Glob(filepath.Join("testdata", "grant_results", "GRANT-*.json")) + require.NoError(t, err, "failed to glob test files") + require.NotEmpty(t, files, "no GRANT-*.json test files found in testdata/grant_results/") + + t.Logf("Loaded %d grant test files", len(files)) + + users := setupGrantsCompatUsers() + nodes := setupGrantsCompatNodes(users) + + for _, file := range files { + tf := loadGrantTestFile(t, file) + + t.Run(tf.TestID, func(t *testing.T) { + t.Parallel() + + // Check if this test is in the skip list + if reason, ok := grantSkipReasons[tf.TestID]; ok { + t.Skipf("TODO: %s — see grantSkipReasons comments for details", reason) + return + } + + // Convert Tailscale user emails to headscale @example.com format + policyJSON := convertPolicyUserEmails(tf.Input.FullPolicy) + + if tf.Input.APIResponseCode == 400 || tf.Error { + testGrantError(t, policyJSON, tf) + return + } + + testGrantSuccess(t, policyJSON, tf, users, nodes) + }) + } +} + +// testGrantError verifies that an invalid policy produces the expected error. +func testGrantError(t *testing.T, policyJSON []byte, tf grantTestFile) { + t.Helper() + + wantMsg := "" + if tf.Input.APIResponseBody != nil { + wantMsg = tf.Input.APIResponseBody.Message + } + + pol, err := unmarshalPolicy(policyJSON) + if err != nil { + // Parse-time error + if wantMsg != "" { + assertGrantErrorContains(t, err, wantMsg, tf.TestID) + } + + return + } + + err = pol.validate() + if err != nil { + // Validation error + if wantMsg != "" { + assertGrantErrorContains(t, err, wantMsg, tf.TestID) + } + + return + } + + t.Errorf("%s: expected error (api_response_code=400) but policy parsed and validated successfully; want message: %q", + tf.TestID, wantMsg) +} + +// grantErrorMessageMap maps Tailscale error messages to their headscale equivalents +// where the wording differs but the meaning is the same. +var grantErrorMessageMap = map[string]string{ + // Tailscale says "ip and app can not both be empty", + // headscale says "grants must specify either 'ip' or 'app' field" + "ip and app can not both be empty": "grants must specify either", +} + +// assertGrantErrorContains checks that an error message contains the expected +// Tailscale error message (or its headscale equivalent). +func assertGrantErrorContains(t *testing.T, err error, wantMsg string, testID string) { + t.Helper() + + errStr := err.Error() + + // First try direct substring match + if strings.Contains(errStr, wantMsg) { + return + } + + // Try mapped equivalent + if mapped, ok := grantErrorMessageMap[wantMsg]; ok { + if strings.Contains(errStr, mapped) { + return + } + } + + // Try matching key parts of the error message + // Extract the most distinctive part of the Tailscale message + keyParts := extractErrorKeyParts(wantMsg) + for _, part := range keyParts { + if strings.Contains(errStr, part) { + return + } + } + + t.Errorf("%s: error message mismatch\n tailscale wants: %q\n headscale got: %q", + testID, wantMsg, errStr) +} + +// extractErrorKeyParts extracts distinctive substrings from an error message +// that should appear in any equivalent error message. +func extractErrorKeyParts(msg string) []string { + var parts []string + + // Common patterns to extract + if strings.Contains(msg, "tag:") { + // Extract tag references like tag:nonexistent + for word := range strings.FieldsSeq(msg) { + word = strings.Trim(word, `"'`) + if strings.HasPrefix(word, "tag:") { + parts = append(parts, word) + } + } + } + + if strings.Contains(msg, "autogroup:") { + for word := range strings.FieldsSeq(msg) { + word = strings.Trim(word, `"'`) + if strings.HasPrefix(word, "autogroup:") { + parts = append(parts, word) + } + } + } + + if strings.Contains(msg, "capability name") { + parts = append(parts, "capability") + } + + if strings.Contains(msg, "port range") { + parts = append(parts, "port") + } + + return parts +} + +// testGrantSuccess verifies that a valid policy produces the expected +// packet filter rules for each node. +func testGrantSuccess( + t *testing.T, + policyJSON []byte, + tf grantTestFile, + users types.Users, + nodes types.Nodes, +) { + t.Helper() + + pol, err := unmarshalPolicy(policyJSON) + require.NoError(t, err, "%s: policy should parse successfully", tf.TestID) + + err = pol.validate() + require.NoError(t, err, "%s: policy should validate successfully", tf.TestID) + + for nodeName, capture := range tf.Captures { + t.Run(nodeName, func(t *testing.T) { + // Check if this node was offline during capture. + // tagged-prod was frequently offline (132 of 188 success tests). + // When offline, packet_filter_rules is null and topology shows + // hostname="unknown" with empty tags. + captureIsNull := len(capture.PacketFilterRules) == 0 || + string(capture.PacketFilterRules) == "null" + + if captureIsNull { + topoNode, exists := tf.Topology.Nodes[nodeName] + if exists && (topoNode.Hostname == "unknown" || topoNode.Hostname == "") { + t.Skipf( + "node %s was offline during Tailscale capture (hostname=%q)", + nodeName, + topoNode.Hostname, + ) + + return + } + // Node was online but has null/empty rules — means Tailscale + // produced no rules. headscale should also produce no rules. + } + + node := findGrantsNode(nodes, nodeName) + if node == nil { + t.Skipf( + "node %s not found in test setup (may be a test-specific node)", + nodeName, + ) + + return + } + + // Compile headscale filter rules for this node + gotRules, err := pol.compileFilterRulesForNode( + users, + node.View(), + nodes.ViewSlice(), + ) + require.NoError( + t, + err, + "%s/%s: failed to compile filter rules", + tf.TestID, + nodeName, + ) + + gotRules = policyutil.ReduceFilterRules(node.View(), gotRules) + + // Unmarshal Tailscale expected rules from JSON capture + var wantRules []tailcfg.FilterRule + if !captureIsNull { + err = json.Unmarshal( + []byte(capture.PacketFilterRules), + &wantRules, + ) + require.NoError( + t, + err, + "%s/%s: failed to unmarshal expected rules from JSON", + tf.TestID, + nodeName, + ) + } + + // Compare headscale output against Tailscale expected output. + // The diff labels show (-tailscale +headscale) to make clear + // which side produced which output. + // EquateEmpty treats nil and empty slices as equal since + // Tailscale's JSON null -> nil, headscale may return empty slice. + opts := append(cmpOptions(), cmpopts.EquateEmpty()) + if diff := cmp.Diff(wantRules, gotRules, opts...); diff != "" { + t.Errorf( + "%s/%s: filter rules mismatch (-tailscale +headscale):\n%s", + tf.TestID, + nodeName, + diff, + ) + } + }) + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-A1.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-A1.json new file mode 100644 index 00000000..89fe1c64 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-A1.json @@ -0,0 +1,2538 @@ +{ + "test_id": "GRANT-A1", + "timestamp": "2026-02-23T00:15:55Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_a1.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "example.com/cap/basic": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["*"], "app": { "example.com/cap/basic": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "unknown", + "user_id": 0, + "tags": [], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "example.com/cap/basic": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "example.com/cap/basic", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "example.com/cap/basic", "Values": [{}] } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:948166e45d474f8c241083571e42623091801428142583b3810df46ea6662d6b", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:34627", + "10.65.0.27:34627", + "172.17.0.1:34627", + "172.18.0.1:34627", + "172.19.0.1:34627" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "LastSeen": "2026-02-23T00:20:00.1Z", + "Online": false, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "example.com/cap/basic": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "example.com/cap/basic", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "example.com/cap/basic", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:948166e45d474f8c241083571e42623091801428142583b3810df46ea6662d6b", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:34627", + "10.65.0.27:34627", + "172.17.0.1:34627", + "172.18.0.1:34627", + "172.19.0.1:34627" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "LastSeen": "2026-02-23T00:20:00.1Z", + "Online": false, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "example.com/cap/basic": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "example.com/cap/basic", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "example.com/cap/basic", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:948166e45d474f8c241083571e42623091801428142583b3810df46ea6662d6b", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:34627", + "10.65.0.27:34627", + "172.17.0.1:34627", + "172.18.0.1:34627", + "172.19.0.1:34627" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "LastSeen": "2026-02-23T00:20:00.1Z", + "Online": false, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": null, + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/basic": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/basic", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/basic", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:948166e45d474f8c241083571e42623091801428142583b3810df46ea6662d6b", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:34627", + "10.65.0.27:34627", + "172.17.0.1:34627", + "172.18.0.1:34627", + "172.19.0.1:34627" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "LastSeen": "2026-02-23T00:20:00.1Z", + "Online": false, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "LastSeen": "2026-02-22T20:30:00.1Z", + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "example.com/cap/basic": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "example.com/cap/basic", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "example.com/cap/basic", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:948166e45d474f8c241083571e42623091801428142583b3810df46ea6662d6b", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:34627", + "10.65.0.27:34627", + "172.17.0.1:34627", + "172.18.0.1:34627", + "172.19.0.1:34627" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "LastSeen": "2026-02-23T00:20:00.1Z", + "Online": false, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "LastSeen": "2026-02-22T07:30:00.1Z", + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "LastSeen": "2026-02-21T20:00:00.1Z", + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "LastSeen": "2026-02-22T20:30:00.1Z", + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "example.com/cap/basic": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "example.com/cap/basic", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "example.com/cap/basic", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:948166e45d474f8c241083571e42623091801428142583b3810df46ea6662d6b", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:34627", + "10.65.0.27:34627", + "172.17.0.1:34627", + "172.18.0.1:34627", + "172.19.0.1:34627" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "LastSeen": "2026-02-23T00:20:00.1Z", + "Online": false, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "LastSeen": "2026-02-22T07:30:00.1Z", + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "LastSeen": "2026-02-22T20:30:00.1Z", + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "example.com/cap/basic": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "example.com/cap/basic", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "example.com/cap/basic", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:948166e45d474f8c241083571e42623091801428142583b3810df46ea6662d6b", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:34627", + "10.65.0.27:34627", + "172.17.0.1:34627", + "172.18.0.1:34627", + "172.19.0.1:34627" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "LastSeen": "2026-02-23T00:20:00.1Z", + "Online": false, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/basic": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/basic": [{}] } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-A2.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-A2.json new file mode 100644 index 00000000..f0fb092c --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-A2.json @@ -0,0 +1,50 @@ +{ + "test_id": "GRANT-A2", + "description": "", + "timestamp": "2026-02-23T00:17:36Z", + "error": true, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_a2.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "https://tailscale.com/cap/ingress": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["*"], "app": { "https://tailscale.com/cap/ingress": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "capability name must have the form {domain}/{path}" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-A3.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-A3.json new file mode 100644 index 00000000..9d8152a0 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-A3.json @@ -0,0 +1,2286 @@ +{ + "test_id": "GRANT-A3", + "timestamp": "2026-02-23T00:17:41Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_a3.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "tailscale.com/cap/webui": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["*"], "app": { "tailscale.com/cap/webui": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "unknown", + "user_id": 0, + "tags": [], + "ipv4": "unknown", + "ipv6": "unknown" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "tailscale.com/cap/webui", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "tailscale.com/cap/webui", "Values": [{}] } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "tailscale.com/cap/webui", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "tailscale.com/cap/webui", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "tailscale.com/cap/webui", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "tailscale.com/cap/webui", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": null, + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "tailscale.com/cap/webui", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "tailscale.com/cap/webui", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json unknown", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "LastSeen": "2026-02-22T20:30:00.1Z", + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "tailscale.com/cap/webui", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "tailscale.com/cap/webui", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "LastSeen": "2026-02-22T07:30:00.1Z", + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "LastSeen": "2026-02-21T20:00:00.1Z", + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "LastSeen": "2026-02-22T20:30:00.1Z", + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "tailscale.com/cap/webui", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "tailscale.com/cap/webui", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "LastSeen": "2026-02-22T07:30:00.1Z", + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "LastSeen": "2026-02-22T20:30:00.1Z", + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "tailscale.com/cap/webui", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "tailscale.com/cap/webui", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "tailscale.com/cap/webui": [{}] } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-A4.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-A4.json new file mode 100644 index 00000000..13e16aad --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-A4.json @@ -0,0 +1,2566 @@ +{ + "test_id": "GRANT-A4", + "timestamp": "2026-02-23T00:18:54Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_a4.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "tailscale.com/cap/relay": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["*"], "app": { "tailscale.com/cap/relay": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "unknown", + "user_id": 0, + "tags": [], + "ipv4": "unknown", + "ipv6": "unknown" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "tailscale.com/cap/relay": [{}] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "tailscale.com/cap/relay-target": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "tailscale.com/cap/relay", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "tailscale.com/cap/relay", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "tailscale.com/cap/relay-target", "Values": null }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "tailscale.com/cap/relay-target", "Values": null } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "tailscale.com/cap/relay": [{}] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "tailscale.com/cap/relay-target": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "tailscale.com/cap/relay", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "tailscale.com/cap/relay", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "tailscale.com/cap/relay-target", "Values": null }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "tailscale.com/cap/relay-target", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "tailscale.com/cap/relay": [{}] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "tailscale.com/cap/relay-target": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "tailscale.com/cap/relay", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "tailscale.com/cap/relay", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "tailscale.com/cap/relay-target", "Values": null }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "tailscale.com/cap/relay-target", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": null, + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "tailscale.com/cap/relay": [{}] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "tailscale.com/cap/relay-target": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "tailscale.com/cap/relay", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "tailscale.com/cap/relay", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "tailscale.com/cap/relay-target", "Values": null }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "tailscale.com/cap/relay-target", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json unknown", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "LastSeen": "2026-02-22T20:30:00.1Z", + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "tailscale.com/cap/relay": [{}] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "tailscale.com/cap/relay-target": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "tailscale.com/cap/relay", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "tailscale.com/cap/relay", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "tailscale.com/cap/relay-target", "Values": null }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "tailscale.com/cap/relay-target", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "LastSeen": "2026-02-22T07:30:00.1Z", + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "LastSeen": "2026-02-21T20:00:00.1Z", + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "LastSeen": "2026-02-22T20:30:00.1Z", + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "tailscale.com/cap/relay": [{}] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "tailscale.com/cap/relay-target": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "tailscale.com/cap/relay", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "tailscale.com/cap/relay", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "tailscale.com/cap/relay-target", "Values": null }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "tailscale.com/cap/relay-target", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "LastSeen": "2026-02-22T07:30:00.1Z", + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "LastSeen": "2026-02-22T20:30:00.1Z", + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "tailscale.com/cap/relay": [{}] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "tailscale.com/cap/relay-target": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "tailscale.com/cap/relay", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "tailscale.com/cap/relay", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "tailscale.com/cap/relay-target", "Values": null }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "tailscale.com/cap/relay-target", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "tailscale.com/cap/relay": [{}], "tailscale.com/cap/relay-target": null } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-A5.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-A5.json new file mode 100644 index 00000000..946933b7 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-A5.json @@ -0,0 +1,50 @@ +{ + "test_id": "GRANT-A5", + "description": "", + "timestamp": "2026-02-23T00:20:08Z", + "error": true, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_a5.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "tailscale.com/cap/relay-target": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["*"], "app": { "tailscale.com/cap/relay-target": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "capability name must not be in the tailscale.com domain" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-A6.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-A6.json new file mode 100644 index 00000000..4964a600 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-A6.json @@ -0,0 +1,641 @@ +{ + "test_id": "GRANT-A6", + "timestamp": "2026-02-23T00:20:13Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_a6.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["autogroup:self"], + "app": { + "tailscale.com/cap/drive": [ + { + "shares": ["*"], + "access": "rw" + } + ] + } + } + ] + }, + "grants_section": [ + { + "src": ["autogroup:member"], + "dst": ["autogroup:self"], + "app": { "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] } + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "unknown", + "user_id": 0, + "tags": [], + "ipv4": "unknown", + "ipv6": "unknown" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": null, + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json unknown", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.110.121.96", "fd7a:115c:a1e0::1737:7960"], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] } + } + ] + }, + { + "SrcIPs": ["100.110.121.96", "fd7a:115c:a1e0::1737:7960"], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.110.121.96/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::1737:7960/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.103.90.82", "fd7a:115c:a1e0::9e37:5a52"], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] } + } + ] + }, + { + "SrcIPs": ["100.103.90.82", "fd7a:115c:a1e0::9e37:5a52"], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.103.90.82/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::9e37:5a52/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] } + } + ] + }, + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.90.199.68/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::2d01:c747/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-B1.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-B1.json new file mode 100644 index 00000000..c54ec78c --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-B1.json @@ -0,0 +1,973 @@ +{ + "test_id": "GRANT-B1", + "timestamp": "2026-02-23T00:21:26Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_b1.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "app": { + "tailscale.com/cap/kubernetes": [ + { + "impersonate": { + "groups": ["system:masters"] + } + } + ] + } + } + ] + }, + "grants_section": [ + { + "src": ["*"], + "dst": ["tag:server"], + "app": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "unknown", + "user_id": 0, + "tags": [], + "ipv4": "unknown", + "ipv6": "unknown" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": null, + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.108.74.26/32", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + }, + { + "Dst": "fd7a:115c:a1e0::b901:4a87/128", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json unknown", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-B2.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-B2.json new file mode 100644 index 00000000..d4206412 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-B2.json @@ -0,0 +1,1018 @@ +{ + "test_id": "GRANT-B2", + "timestamp": "2026-02-23T00:22:39Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_b2.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "app": { + "tailscale.com/cap/kubernetes": [ + { + "impersonate": { + "groups": ["readers"] + } + }, + { + "impersonate": { + "groups": ["writers"] + } + } + ] + } + } + ] + }, + "grants_section": [ + { + "src": ["*"], + "dst": ["tag:server"], + "app": { + "tailscale.com/cap/kubernetes": [ + { "impersonate": { "groups": ["readers"] } }, + { "impersonate": { "groups": ["writers"] } } + ] + } + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "unknown", + "user_id": 0, + "tags": [], + "ipv4": "unknown", + "ipv6": "unknown" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": null, + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { + "tailscale.com/cap/kubernetes": [ + { "impersonate": { "groups": ["readers"] } }, + { "impersonate": { "groups": ["writers"] } } + ] + } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.108.74.26/32", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["readers"] } }, { "impersonate": { "groups": ["writers"] } }] + }, + { + "Dst": "fd7a:115c:a1e0::b901:4a87/128", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["readers"] } }, { "impersonate": { "groups": ["writers"] } }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/kubernetes": [ + { "impersonate": { "groups": ["readers"] } }, + { "impersonate": { "groups": ["writers"] } } + ] + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/kubernetes": [ + { "impersonate": { "groups": ["readers"] } }, + { "impersonate": { "groups": ["writers"] } } + ] + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/kubernetes": [ + { "impersonate": { "groups": ["readers"] } }, + { "impersonate": { "groups": ["writers"] } } + ] + } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json unknown", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/kubernetes": [ + { "impersonate": { "groups": ["readers"] } }, + { "impersonate": { "groups": ["writers"] } } + ] + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/kubernetes": [ + { "impersonate": { "groups": ["readers"] } }, + { "impersonate": { "groups": ["writers"] } } + ] + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/kubernetes": [ + { "impersonate": { "groups": ["readers"] } }, + { "impersonate": { "groups": ["writers"] } } + ] + } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-B3.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-B3.json new file mode 100644 index 00000000..4edd7544 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-B3.json @@ -0,0 +1,2749 @@ +{ + "test_id": "GRANT-B3", + "timestamp": "2026-02-23T00:23:52Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_b3.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "tailscale.com/cap/drive": [ + { + "shares": ["docs"], + "access": "ro" + } + ] + } + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["*"], "app": { "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }] } } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "unknown", + "user_id": 0, + "tags": [], + "ipv4": "unknown", + "ipv6": "unknown" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.85.66.106/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["docs"], "access": "ro" }] + }, + { + "Dst": "fd7a:115c:a1e0::7c37:426a/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["docs"], "access": "ro" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.92.142.61/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["docs"], "access": "ro" }] + }, + { + "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["docs"], "access": "ro" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.83.200.69/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["docs"], "access": "ro" }] + }, + { + "Dst": "fd7a:115c:a1e0::c537:c845/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["docs"], "access": "ro" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": null, + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.108.74.26/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["docs"], "access": "ro" }] + }, + { + "Dst": "fd7a:115c:a1e0::b901:4a87/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["docs"], "access": "ro" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json unknown", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.110.121.96/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["docs"], "access": "ro" }] + }, + { + "Dst": "fd7a:115c:a1e0::1737:7960/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["docs"], "access": "ro" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.103.90.82/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["docs"], "access": "ro" }] + }, + { + "Dst": "fd7a:115c:a1e0::9e37:5a52/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["docs"], "access": "ro" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.90.199.68/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["docs"], "access": "ro" }] + }, + { + "Dst": "fd7a:115c:a1e0::2d01:c747/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["docs"], "access": "ro" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["docs"], "access": "ro" }], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-B4.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-B4.json new file mode 100644 index 00000000..08e2c99a --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-B4.json @@ -0,0 +1,2965 @@ +{ + "test_id": "GRANT-B4", + "timestamp": "2026-02-23T00:25:05Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_b4.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "tailscale.com/cap/drive": [ + { + "shares": ["docs"], + "access": "ro" + }, + { + "shares": ["photos"], + "access": "rw" + } + ] + } + } + ] + }, + "grants_section": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ] + } + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "unknown", + "user_id": 0, + "tags": [], + "ipv4": "unknown", + "ipv6": "unknown" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.85.66.106/32", + "Cap": "tailscale.com/cap/drive", + "Values": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ] + }, + { + "Dst": "fd7a:115c:a1e0::7c37:426a/128", + "Cap": "tailscale.com/cap/drive", + "Values": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.92.142.61/32", + "Cap": "tailscale.com/cap/drive", + "Values": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ] + }, + { + "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", + "Cap": "tailscale.com/cap/drive", + "Values": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.83.200.69/32", + "Cap": "tailscale.com/cap/drive", + "Values": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ] + }, + { + "Dst": "fd7a:115c:a1e0::c537:c845/128", + "Cap": "tailscale.com/cap/drive", + "Values": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": null, + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.108.74.26/32", + "Cap": "tailscale.com/cap/drive", + "Values": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ] + }, + { + "Dst": "fd7a:115c:a1e0::b901:4a87/128", + "Cap": "tailscale.com/cap/drive", + "Values": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json unknown", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.110.121.96/32", + "Cap": "tailscale.com/cap/drive", + "Values": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ] + }, + { + "Dst": "fd7a:115c:a1e0::1737:7960/128", + "Cap": "tailscale.com/cap/drive", + "Values": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.103.90.82/32", + "Cap": "tailscale.com/cap/drive", + "Values": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ] + }, + { + "Dst": "fd7a:115c:a1e0::9e37:5a52/128", + "Cap": "tailscale.com/cap/drive", + "Values": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.90.199.68/32", + "Cap": "tailscale.com/cap/drive", + "Values": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ] + }, + { + "Dst": "fd7a:115c:a1e0::2d01:c747/128", + "Cap": "tailscale.com/cap/drive", + "Values": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [ + { "shares": ["docs"], "access": "ro" }, + { "shares": ["photos"], "access": "rw" } + ], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-B5.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-B5.json new file mode 100644 index 00000000..c8b89348 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-B5.json @@ -0,0 +1,2749 @@ +{ + "test_id": "GRANT-B5", + "timestamp": "2026-02-23T00:26:19Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_b5.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "tailscale.com/cap/drive": [ + { + "shares": ["*"], + "access": "rw" + } + ] + } + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["*"], "app": { "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] } } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "unknown", + "user_id": 0, + "tags": [], + "ipv4": "unknown", + "ipv6": "unknown" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.85.66.106/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::7c37:426a/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.92.142.61/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.83.200.69/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::c537:c845/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": null, + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.108.74.26/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::b901:4a87/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json unknown", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.110.121.96/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::1737:7960/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.103.90.82/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::9e37:5a52/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.90.199.68/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::2d01:c747/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "unknown": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json unknown", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-C1.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-C1.json new file mode 100644 index 00000000..7b4272ef --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-C1.json @@ -0,0 +1,2814 @@ +{ + "test_id": "GRANT-C1", + "timestamp": "2026-02-23T00:28:11Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_c1.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "example.com/cap/test": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["*"], "app": { "example.com/cap/test": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { "Dsts": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], "CapMap": { "example.com/cap/test": [{}] } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.8.15/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::5b37:80f/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-C2.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-C2.json new file mode 100644 index 00000000..d752211f --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-C2.json @@ -0,0 +1,2821 @@ +{ + "test_id": "GRANT-C2", + "timestamp": "2026-02-23T00:28:28Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_c2.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "example.com/cap/test": [ + { + "role": "admin" + } + ] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["*"], "app": { "example.com/cap/test": [{ "role": "admin" }] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "example.com/cap/test", "Values": [{ "role": "admin" }] }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "example.com/cap/test", "Values": [{ "role": "admin" }] } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "example.com/cap/test", "Values": [{ "role": "admin" }] }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "example.com/cap/test", "Values": [{ "role": "admin" }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "example.com/cap/test", "Values": [{ "role": "admin" }] }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "example.com/cap/test", "Values": [{ "role": "admin" }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.8.15/32", "Cap": "example.com/cap/test", "Values": [{ "role": "admin" }] }, + { "Dst": "fd7a:115c:a1e0::5b37:80f/128", "Cap": "example.com/cap/test", "Values": [{ "role": "admin" }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{ "role": "admin" }] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{ "role": "admin" }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "example.com/cap/test", "Values": [{ "role": "admin" }] }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "example.com/cap/test", "Values": [{ "role": "admin" }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "example.com/cap/test", "Values": [{ "role": "admin" }] }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "example.com/cap/test", "Values": [{ "role": "admin" }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "example.com/cap/test", "Values": [{ "role": "admin" }] }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "example.com/cap/test", "Values": [{ "role": "admin" }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-C3.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-C3.json new file mode 100644 index 00000000..40b56246 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-C3.json @@ -0,0 +1,2890 @@ +{ + "test_id": "GRANT-C3", + "timestamp": "2026-02-23T00:28:45Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_c3.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "example.com/cap/test": [ + { + "role": "admin" + }, + { + "role": "viewer" + } + ] + } + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["*"], "app": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.85.66.106/32", + "Cap": "example.com/cap/test", + "Values": [{ "role": "admin" }, { "role": "viewer" }] + }, + { + "Dst": "fd7a:115c:a1e0::7c37:426a/128", + "Cap": "example.com/cap/test", + "Values": [{ "role": "admin" }, { "role": "viewer" }] + } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.92.142.61/32", + "Cap": "example.com/cap/test", + "Values": [{ "role": "admin" }, { "role": "viewer" }] + }, + { + "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", + "Cap": "example.com/cap/test", + "Values": [{ "role": "admin" }, { "role": "viewer" }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.83.200.69/32", + "Cap": "example.com/cap/test", + "Values": [{ "role": "admin" }, { "role": "viewer" }] + }, + { + "Dst": "fd7a:115c:a1e0::c537:c845/128", + "Cap": "example.com/cap/test", + "Values": [{ "role": "admin" }, { "role": "viewer" }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.103.8.15/32", + "Cap": "example.com/cap/test", + "Values": [{ "role": "admin" }, { "role": "viewer" }] + }, + { + "Dst": "fd7a:115c:a1e0::5b37:80f/128", + "Cap": "example.com/cap/test", + "Values": [{ "role": "admin" }, { "role": "viewer" }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.108.74.26/32", + "Cap": "example.com/cap/test", + "Values": [{ "role": "admin" }, { "role": "viewer" }] + }, + { + "Dst": "fd7a:115c:a1e0::b901:4a87/128", + "Cap": "example.com/cap/test", + "Values": [{ "role": "admin" }, { "role": "viewer" }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.110.121.96/32", + "Cap": "example.com/cap/test", + "Values": [{ "role": "admin" }, { "role": "viewer" }] + }, + { + "Dst": "fd7a:115c:a1e0::1737:7960/128", + "Cap": "example.com/cap/test", + "Values": [{ "role": "admin" }, { "role": "viewer" }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.103.90.82/32", + "Cap": "example.com/cap/test", + "Values": [{ "role": "admin" }, { "role": "viewer" }] + }, + { + "Dst": "fd7a:115c:a1e0::9e37:5a52/128", + "Cap": "example.com/cap/test", + "Values": [{ "role": "admin" }, { "role": "viewer" }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.90.199.68/32", + "Cap": "example.com/cap/test", + "Values": [{ "role": "admin" }, { "role": "viewer" }] + }, + { + "Dst": "fd7a:115c:a1e0::2d01:c747/128", + "Cap": "example.com/cap/test", + "Values": [{ "role": "admin" }, { "role": "viewer" }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }, { "role": "viewer" }] } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-C4.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-C4.json new file mode 100644 index 00000000..8543e419 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-C4.json @@ -0,0 +1,2844 @@ +{ + "test_id": "GRANT-C4", + "timestamp": "2026-02-23T00:29:02Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_c4.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "example.com/cap/one": [{}], + "example.com/cap/two": [ + { + "level": "high" + } + ] + } + } + ] + }, + "grants_section": [ + { + "src": ["*"], + "dst": ["*"], + "app": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "100.85.66.106/32", "Cap": "example.com/cap/two", "Values": [{ "level": "high" }] }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "example.com/cap/two", "Values": [{ "level": "high" }] } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "100.92.142.61/32", "Cap": "example.com/cap/two", "Values": [{ "level": "high" }] }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "example.com/cap/two", "Values": [{ "level": "high" }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "100.83.200.69/32", "Cap": "example.com/cap/two", "Values": [{ "level": "high" }] }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "example.com/cap/two", "Values": [{ "level": "high" }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.8.15/32", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "100.103.8.15/32", "Cap": "example.com/cap/two", "Values": [{ "level": "high" }] }, + { "Dst": "fd7a:115c:a1e0::5b37:80f/128", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::5b37:80f/128", "Cap": "example.com/cap/two", "Values": [{ "level": "high" }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/two", "Values": [{ "level": "high" }] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/two", "Values": [{ "level": "high" }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "example.com/cap/two", "Values": [{ "level": "high" }] }, + { "Dst": "100.110.121.96/32", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "example.com/cap/two", "Values": [{ "level": "high" }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "100.103.90.82/32", "Cap": "example.com/cap/two", "Values": [{ "level": "high" }] }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "example.com/cap/two", "Values": [{ "level": "high" }] }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "example.com/cap/one", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "100.90.199.68/32", "Cap": "example.com/cap/two", "Values": [{ "level": "high" }] }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "example.com/cap/two", "Values": [{ "level": "high" }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "level": "high" }] } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-C5.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-C5.json new file mode 100644 index 00000000..6440ab92 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-C5.json @@ -0,0 +1,2891 @@ +{ + "test_id": "GRANT-C5", + "timestamp": "2026-02-23T00:29:18Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_c5.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "example.com/cap/complex": [ + { + "nested": { + "deep": { + "value": 42 + } + } + } + ] + } + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["*"], "app": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.85.66.106/32", + "Cap": "example.com/cap/complex", + "Values": [{ "nested": { "deep": { "value": 42 } } }] + }, + { + "Dst": "fd7a:115c:a1e0::7c37:426a/128", + "Cap": "example.com/cap/complex", + "Values": [{ "nested": { "deep": { "value": 42 } } }] + } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.92.142.61/32", + "Cap": "example.com/cap/complex", + "Values": [{ "nested": { "deep": { "value": 42 } } }] + }, + { + "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", + "Cap": "example.com/cap/complex", + "Values": [{ "nested": { "deep": { "value": 42 } } }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.83.200.69/32", + "Cap": "example.com/cap/complex", + "Values": [{ "nested": { "deep": { "value": 42 } } }] + }, + { + "Dst": "fd7a:115c:a1e0::c537:c845/128", + "Cap": "example.com/cap/complex", + "Values": [{ "nested": { "deep": { "value": 42 } } }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.103.8.15/32", + "Cap": "example.com/cap/complex", + "Values": [{ "nested": { "deep": { "value": 42 } } }] + }, + { + "Dst": "fd7a:115c:a1e0::5b37:80f/128", + "Cap": "example.com/cap/complex", + "Values": [{ "nested": { "deep": { "value": 42 } } }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.108.74.26/32", + "Cap": "example.com/cap/complex", + "Values": [{ "nested": { "deep": { "value": 42 } } }] + }, + { + "Dst": "fd7a:115c:a1e0::b901:4a87/128", + "Cap": "example.com/cap/complex", + "Values": [{ "nested": { "deep": { "value": 42 } } }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.110.121.96/32", + "Cap": "example.com/cap/complex", + "Values": [{ "nested": { "deep": { "value": 42 } } }] + }, + { + "Dst": "fd7a:115c:a1e0::1737:7960/128", + "Cap": "example.com/cap/complex", + "Values": [{ "nested": { "deep": { "value": 42 } } }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.103.90.82/32", + "Cap": "example.com/cap/complex", + "Values": [{ "nested": { "deep": { "value": 42 } } }] + }, + { + "Dst": "fd7a:115c:a1e0::9e37:5a52/128", + "Cap": "example.com/cap/complex", + "Values": [{ "nested": { "deep": { "value": 42 } } }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.90.199.68/32", + "Cap": "example.com/cap/complex", + "Values": [{ "nested": { "deep": { "value": 42 } } }] + }, + { + "Dst": "fd7a:115c:a1e0::2d01:c747/128", + "Cap": "example.com/cap/complex", + "Values": [{ "nested": { "deep": { "value": 42 } } }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/complex": [{ "nested": { "deep": { "value": 42 } } }] } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-C6.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-C6.json new file mode 100644 index 00000000..3b8ae4f5 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-C6.json @@ -0,0 +1,2853 @@ +{ + "test_id": "GRANT-C6", + "timestamp": "2026-02-23T00:29:35Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_c6.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "example.com/cap/array": [ + { + "items": [1, 2, 3] + } + ] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["*"], "app": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "example.com/cap/array", "Values": [{ "items": [1, 2, 3] }] }, + { + "Dst": "fd7a:115c:a1e0::7c37:426a/128", + "Cap": "example.com/cap/array", + "Values": [{ "items": [1, 2, 3] }] + } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "example.com/cap/array", "Values": [{ "items": [1, 2, 3] }] }, + { + "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", + "Cap": "example.com/cap/array", + "Values": [{ "items": [1, 2, 3] }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "example.com/cap/array", "Values": [{ "items": [1, 2, 3] }] }, + { + "Dst": "fd7a:115c:a1e0::c537:c845/128", + "Cap": "example.com/cap/array", + "Values": [{ "items": [1, 2, 3] }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.8.15/32", "Cap": "example.com/cap/array", "Values": [{ "items": [1, 2, 3] }] }, + { + "Dst": "fd7a:115c:a1e0::5b37:80f/128", + "Cap": "example.com/cap/array", + "Values": [{ "items": [1, 2, 3] }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/array", "Values": [{ "items": [1, 2, 3] }] }, + { + "Dst": "fd7a:115c:a1e0::b901:4a87/128", + "Cap": "example.com/cap/array", + "Values": [{ "items": [1, 2, 3] }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "example.com/cap/array", "Values": [{ "items": [1, 2, 3] }] }, + { + "Dst": "fd7a:115c:a1e0::1737:7960/128", + "Cap": "example.com/cap/array", + "Values": [{ "items": [1, 2, 3] }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "example.com/cap/array", "Values": [{ "items": [1, 2, 3] }] }, + { + "Dst": "fd7a:115c:a1e0::9e37:5a52/128", + "Cap": "example.com/cap/array", + "Values": [{ "items": [1, 2, 3] }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "example.com/cap/array", "Values": [{ "items": [1, 2, 3] }] }, + { + "Dst": "fd7a:115c:a1e0::2d01:c747/128", + "Cap": "example.com/cap/array", + "Values": [{ "items": [1, 2, 3] }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/array": [{ "items": [1, 2, 3] }] } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-D1.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-D1.json new file mode 100644 index 00000000..548e552a --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-D1.json @@ -0,0 +1,735 @@ +{ + "test_id": "GRANT-D1", + "timestamp": "2026-02-23T00:29:52Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_d1.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["tag:server"], + "app": { + "example.com/cap/test": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["autogroup:member"], "dst": ["tag:server"], "app": { "example.com/cap/test": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-D2.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-D2.json new file mode 100644 index 00000000..c6913a69 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-D2.json @@ -0,0 +1,809 @@ +{ + "test_id": "GRANT-D2", + "timestamp": "2026-02-23T00:30:09Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_d2.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:tagged"], + "dst": ["tag:server"], + "app": { + "example.com/cap/test": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["autogroup:tagged"], "dst": ["tag:server"], "app": { "example.com/cap/test": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-D3.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-D3.json new file mode 100644 index 00000000..1c3bb20b --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-D3.json @@ -0,0 +1,577 @@ +{ + "test_id": "GRANT-D3", + "timestamp": "2026-02-23T00:30:25Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_d3.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["group:admins"], + "dst": ["tag:server"], + "app": { + "example.com/cap/test": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["group:admins"], "dst": ["tag:server"], "app": { "example.com/cap/test": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-D4.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-D4.json new file mode 100644 index 00000000..0a3c3193 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-D4.json @@ -0,0 +1,579 @@ +{ + "test_id": "GRANT-D4", + "timestamp": "2026-02-23T00:30:42Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_d4.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["kratail2tid@passkey"], + "dst": ["tag:server"], + "app": { + "example.com/cap/test": [{}] + } + } + ] + }, + "grants_section": [ + { "src": ["kratail2tid@passkey"], "dst": ["tag:server"], "app": { "example.com/cap/test": [{}] } } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-D5.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-D5.json new file mode 100644 index 00000000..1b3950a7 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-D5.json @@ -0,0 +1,577 @@ +{ + "test_id": "GRANT-D5", + "timestamp": "2026-02-23T00:30:59Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_d5.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:prod"], + "dst": ["tag:server"], + "app": { + "example.com/cap/test": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["tag:prod"], "dst": ["tag:server"], "app": { "example.com/cap/test": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.103.8.15", "fd7a:115c:a1e0::5b37:80f"], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-D6.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-D6.json new file mode 100644 index 00000000..e849398a --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-D6.json @@ -0,0 +1,577 @@ +{ + "test_id": "GRANT-D6", + "timestamp": "2026-02-23T00:31:16Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_d6.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["100.90.199.68"], + "dst": ["tag:server"], + "app": { + "example.com/cap/test": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["100.90.199.68"], "dst": ["tag:server"], "app": { "example.com/cap/test": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68"], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-D7.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-D7.json new file mode 100644 index 00000000..1b1c585d --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-D7.json @@ -0,0 +1,811 @@ +{ + "test_id": "GRANT-D7", + "timestamp": "2026-02-23T00:31:33Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_d7.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member", "tag:prod"], + "dst": ["tag:server"], + "app": { + "example.com/cap/test": [{}] + } + } + ] + }, + "grants_section": [ + { "src": ["autogroup:member", "tag:prod"], "dst": ["tag:server"], "app": { "example.com/cap/test": [{}] } } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::9e37:5a52" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-E1.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-E1.json new file mode 100644 index 00000000..b7ce8fd4 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-E1.json @@ -0,0 +1,1023 @@ +{ + "test_id": "GRANT-E1", + "timestamp": "2026-02-23T00:31:50Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_e1.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "app": { + "example.com/cap/test": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["tag:server"], "app": { "example.com/cap/test": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-E2.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-E2.json new file mode 100644 index 00000000..b6fc6cb3 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-E2.json @@ -0,0 +1,1487 @@ +{ + "test_id": "GRANT-E2", + "timestamp": "2026-02-23T00:32:07Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_e2.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server", "tag:prod"], + "app": { + "example.com/cap/test": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["tag:server", "tag:prod"], "app": { "example.com/cap/test": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { "Dsts": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], "CapMap": { "example.com/cap/test": [{}] } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.8.15/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::5b37:80f/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-E3.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-E3.json new file mode 100644 index 00000000..86b4a55b --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-E3.json @@ -0,0 +1,61 @@ +{ + "test_id": "GRANT-E3", + "description": "", + "timestamp": "2026-02-23T00:32:23Z", + "error": true, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_e3.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["autogroup:self"], + "app": { + "tailscale.com/cap/drive": [ + { + "shares": ["*"], + "access": "rw" + } + ] + } + } + ] + }, + "grants_section": [ + { + "src": ["*"], + "dst": ["autogroup:self"], + "app": { "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] } + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "autogroup:self can only be used with users, groups, or supported autogroups" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-E4.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-E4.json new file mode 100644 index 00000000..a4c42d66 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-E4.json @@ -0,0 +1,1903 @@ +{ + "test_id": "GRANT-E4", + "timestamp": "2026-02-23T00:32:23Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_e4.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["autogroup:member"], + "app": { + "example.com/cap/test": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["autogroup:member"], "app": { "example.com/cap/test": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-E5.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-E5.json new file mode 100644 index 00000000..fb8bd4d6 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-E5.json @@ -0,0 +1,2467 @@ +{ + "test_id": "GRANT-E5", + "timestamp": "2026-02-23T00:32:40Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_e5.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["autogroup:tagged"], + "app": { + "example.com/cap/test": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["autogroup:tagged"], "app": { "example.com/cap/test": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { "Dsts": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], "CapMap": { "example.com/cap/test": [{}] } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.8.15/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::5b37:80f/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-E6.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-E6.json new file mode 100644 index 00000000..ebfc4648 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-E6.json @@ -0,0 +1,1023 @@ +{ + "test_id": "GRANT-E6", + "timestamp": "2026-02-23T00:32:57Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_e6.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["group:admins"], + "app": { + "example.com/cap/test": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["group:admins"], "app": { "example.com/cap/test": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-E7.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-E7.json new file mode 100644 index 00000000..82d9a08d --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-E7.json @@ -0,0 +1,1023 @@ +{ + "test_id": "GRANT-E7", + "timestamp": "2026-02-23T00:33:14Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_e7.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["kratail2tid@passkey"], + "app": { + "example.com/cap/test": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["kratail2tid@passkey"], "app": { "example.com/cap/test": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-E8.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-E8.json new file mode 100644 index 00000000..4978cb68 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-E8.json @@ -0,0 +1,1015 @@ +{ + "test_id": "GRANT-E8", + "timestamp": "2026-02-23T00:33:31Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_e8.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["100.108.74.26"], + "app": { + "example.com/cap/test": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["100.108.74.26"], "app": { "example.com/cap/test": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [{ "Dsts": ["100.108.74.26/32"], "CapMap": { "example.com/cap/test": [{}] } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [{ "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{}] }] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-F1.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-F1.json new file mode 100644 index 00000000..d6e437d7 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-F1.json @@ -0,0 +1,1088 @@ +{ + "test_id": "GRANT-F1", + "timestamp": "2026-02-23T00:33:47Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_f1.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["tcp:80", "tcp:443"], + "app": { + "tailscale.com/cap/kubernetes": [ + { + "impersonate": { + "groups": ["system:masters"] + } + } + ] + } + } + ] + }, + "grants_section": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["tcp:80", "tcp:443"], + "app": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.108.74.26", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 443, "Last": 443 } } + ], + "IPProto": [6] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.108.74.26/32", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + }, + { + "Dst": "fd7a:115c:a1e0::b901:4a87/128", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-F2.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-F2.json new file mode 100644 index 00000000..a15ba3d5 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-F2.json @@ -0,0 +1,778 @@ +{ + "test_id": "GRANT-F2", + "timestamp": "2026-02-23T00:34:04Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_f2.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["tag:server"], + "ip": ["*"], + "app": { + "example.com/cap/test": [ + { + "role": "admin" + } + ] + } + } + ] + }, + "grants_section": [ + { + "src": ["autogroup:member"], + "dst": ["tag:server"], + "ip": ["*"], + "app": { "example.com/cap/test": [{ "role": "admin" }] } + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 0, "Last": 65535 } } + ] + }, + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{ "role": "admin" }] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{ "role": "admin" }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "role": "admin" }] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-F3.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-F3.json new file mode 100644 index 00000000..0eaae38b --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-F3.json @@ -0,0 +1,1092 @@ +{ + "test_id": "GRANT-F3", + "timestamp": "2026-02-23T00:34:21Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_f3.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["tcp:80", "tcp:443"] + }, + { + "src": ["*"], + "dst": ["tag:server"], + "app": { + "tailscale.com/cap/kubernetes": [ + { + "impersonate": { + "groups": ["system:masters"] + } + } + ] + } + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["tag:server"], "ip": ["tcp:80", "tcp:443"] }, + { + "src": ["*"], + "dst": ["tag:server"], + "app": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.108.74.26", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 443, "Last": 443 } } + ], + "IPProto": [6] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.108.74.26/32", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + }, + { + "Dst": "fd7a:115c:a1e0::b901:4a87/128", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-F4.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-F4.json new file mode 100644 index 00000000..e20256a9 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-F4.json @@ -0,0 +1,3774 @@ +{ + "test_id": "GRANT-F4", + "timestamp": "2026-02-23T00:34:38Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_f4.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "ip": ["tcp:443"], + "app": { + "tailscale.com/cap/drive": [ + { + "shares": ["*"], + "access": "rw" + } + ], + "example.com/cap/extra": [ + { + "mode": "full" + } + ] + } + } + ] + }, + "grants_section": [ + { + "src": ["*"], + "dst": ["*"], + "ip": ["tcp:443"], + "app": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "example.com/cap/extra": [{ "mode": "full" }] + } + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 443, "Last": 443 } }], + "IPProto": [6] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "::/0", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "example.com/cap/extra", "Values": [{ "mode": "full" }] }, + { + "Dst": "100.85.66.106/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "example.com/cap/extra", "Values": [{ "mode": "full" }] }, + { + "Dst": "fd7a:115c:a1e0::7c37:426a/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 443, "Last": 443 } }], + "IPProto": [6] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "::/0", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "example.com/cap/extra", "Values": [{ "mode": "full" }] }, + { + "Dst": "100.92.142.61/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "example.com/cap/extra", "Values": [{ "mode": "full" }] }, + { + "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 443, "Last": 443 } }], + "IPProto": [6] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "::/0", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "example.com/cap/extra", "Values": [{ "mode": "full" }] }, + { + "Dst": "100.83.200.69/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "example.com/cap/extra", "Values": [{ "mode": "full" }] }, + { + "Dst": "fd7a:115c:a1e0::c537:c845/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 443, "Last": 443 } }], + "IPProto": [6] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "::/0", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.8.15/32", "Cap": "example.com/cap/extra", "Values": [{ "mode": "full" }] }, + { + "Dst": "100.103.8.15/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { "Dst": "fd7a:115c:a1e0::5b37:80f/128", "Cap": "example.com/cap/extra", "Values": [{ "mode": "full" }] }, + { + "Dst": "fd7a:115c:a1e0::5b37:80f/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.8.15/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::5b37:80f/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 443, "Last": 443 } }], + "IPProto": [6] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "::/0", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.108.74.26/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/extra", "Values": [{ "mode": "full" }] }, + { + "Dst": "fd7a:115c:a1e0::b901:4a87/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/extra", "Values": [{ "mode": "full" }] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 443, "Last": 443 } }], + "IPProto": [6] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "::/0", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "example.com/cap/extra", "Values": [{ "mode": "full" }] }, + { + "Dst": "100.110.121.96/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "example.com/cap/extra", "Values": [{ "mode": "full" }] }, + { + "Dst": "fd7a:115c:a1e0::1737:7960/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 443, "Last": 443 } }], + "IPProto": [6] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "::/0", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "example.com/cap/extra", "Values": [{ "mode": "full" }] }, + { + "Dst": "100.103.90.82/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "example.com/cap/extra", "Values": [{ "mode": "full" }] }, + { + "Dst": "fd7a:115c:a1e0::9e37:5a52/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 443, "Last": 443 } }], + "IPProto": [6] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "::/0", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "example.com/cap/extra", "Values": [{ "mode": "full" }] }, + { + "Dst": "100.90.199.68/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::2d01:c747/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "example.com/cap/extra", "Values": [{ "mode": "full" }] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "example.com/cap/extra": [{ "mode": "full" }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null + } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-G1.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-G1.json new file mode 100644 index 00000000..1268b199 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-G1.json @@ -0,0 +1,1067 @@ +{ + "test_id": "GRANT-G1", + "timestamp": "2026-02-23T00:34:55Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_g1.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "app": { + "example.com/cap/one": [{}] + } + }, + { + "src": ["*"], + "dst": ["tag:server"], + "app": { + "example.com/cap/two": [{}] + } + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["tag:server"], "app": { "example.com/cap/one": [{}] } }, + { "src": ["*"], "dst": ["tag:server"], "app": { "example.com/cap/two": [{}] } } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], "CapMap": { "example.com/cap/one": [{}] } } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], "CapMap": { "example.com/cap/two": [{}] } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/one", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/two", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/two", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{}] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-G2.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-G2.json new file mode 100644 index 00000000..abd3d112 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-G2.json @@ -0,0 +1,1081 @@ +{ + "test_id": "GRANT-G2", + "timestamp": "2026-02-23T00:35:12Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_g2.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "app": { + "example.com/cap/test": [ + { + "v": 1 + } + ] + } + }, + { + "src": ["*"], + "dst": ["tag:server"], + "app": { + "example.com/cap/test": [ + { + "v": 2 + } + ] + } + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["tag:server"], "app": { "example.com/cap/test": [{ "v": 1 }] } }, + { "src": ["*"], "dst": ["tag:server"], "app": { "example.com/cap/test": [{ "v": 2 }] } } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{ "v": 1 }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{ "v": 2 }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{ "v": 1 }] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{ "v": 1 }] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{ "v": 2 }] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{ "v": 2 }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-G3.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-G3.json new file mode 100644 index 00000000..140f8a51 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-G3.json @@ -0,0 +1,1056 @@ +{ + "test_id": "GRANT-G3", + "timestamp": "2026-02-23T00:35:28Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_g3.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "app": { + "example.com/cap/test": [{}] + } + }, + { + "src": ["tag:client"], + "dst": ["tag:server"], + "app": { + "example.com/cap/test": [ + { + "extra": true + } + ] + } + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["tag:server"], "app": { "example.com/cap/test": [{}] } }, + { "src": ["tag:client"], "dst": ["tag:server"], "app": { "example.com/cap/test": [{ "extra": true }] } } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + }, + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{ "extra": true }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{ "extra": true }] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{ "extra": true }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}, { "extra": true }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-G4.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-G4.json new file mode 100644 index 00000000..91bdcb9b --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-G4.json @@ -0,0 +1,1070 @@ +{ + "test_id": "GRANT-G4", + "timestamp": "2026-02-23T00:35:45Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_g4.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "app": { + "example.com/cap/test": [{}] + } + }, + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["tcp:80"] + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["tag:server"], "app": { "example.com/cap/test": [{}] } }, + { "src": ["*"], "dst": ["tag:server"], "ip": ["tcp:80"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 80 } } + ], + "IPProto": [6] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + }, + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-G5.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-G5.json new file mode 100644 index 00000000..43636cc3 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-G5.json @@ -0,0 +1,2842 @@ +{ + "test_id": "GRANT-G5", + "timestamp": "2026-02-23T00:36:02Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_g5.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "ip": ["*"] + }, + { + "src": ["tag:client"], + "dst": ["tag:server"], + "app": { + "example.com/cap/test": [{}] + } + }, + { + "src": ["autogroup:member"], + "dst": ["tag:server"], + "ip": ["tcp:443"] + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["*"], "ip": ["*"] }, + { "src": ["tag:client"], "dst": ["tag:server"], "app": { "example.com/cap/test": [{}] } }, + { "src": ["autogroup:member"], "dst": ["tag:server"], "ip": ["tcp:443"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + }, + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + }, + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 443, "Last": 443 } } + ], + "IPProto": [6] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + }, + { + "IPProto": [6], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-G6.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-G6.json new file mode 100644 index 00000000..0491e140 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-G6.json @@ -0,0 +1,2868 @@ +{ + "test_id": "GRANT-G6", + "timestamp": "2026-02-23T00:36:19Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_g6.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "example.com/cap/test": [{}] + } + }, + { + "src": ["*"], + "dst": ["tag:server"], + "app": { + "example.com/cap/test": [ + { + "special": true + } + ] + } + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["*"], "app": { "example.com/cap/test": [{}] } }, + { "src": ["*"], "dst": ["tag:server"], "app": { "example.com/cap/test": [{ "special": true }] } } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { "Dsts": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], "CapMap": { "example.com/cap/test": [{}] } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.8.15/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::5b37:80f/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{ "special": true }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{ "special": true }] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{ "special": true }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}, { "special": true }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}, { "special": true }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}, { "special": true }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}, { "special": true }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}, { "special": true }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}, { "special": true }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}, { "special": true }] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-H1.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-H1.json new file mode 100644 index 00000000..9f6e652a --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-H1.json @@ -0,0 +1,48 @@ +{ + "test_id": "GRANT-H1", + "description": "", + "timestamp": "2026-02-23T00:36:36Z", + "error": true, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_h1.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": {} + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["*"], "app": {} }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "ip and app can not both be empty" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-H10.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-H10.json new file mode 100644 index 00000000..fcbc39d3 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-H10.json @@ -0,0 +1,50 @@ +{ + "test_id": "GRANT-H10", + "description": "", + "timestamp": "2026-02-23T00:37:44Z", + "error": true, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_h10.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:self"], + "dst": ["*"], + "app": { + "example.com/cap/test": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["autogroup:self"], "dst": ["*"], "app": { "example.com/cap/test": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "\"autogroup:self\" not valid on the src side of a rule" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-H2.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-H2.json new file mode 100644 index 00000000..2a68d625 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-H2.json @@ -0,0 +1,2793 @@ +{ + "test_id": "GRANT-H2", + "timestamp": "2026-02-23T00:36:36Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_h2.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "example.com/cap/test": [] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["*"], "app": { "example.com/cap/test": [] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], "CapMap": { "example.com/cap/test": [] } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "example.com/cap/test", "Values": [] }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "example.com/cap/test", "Values": [] } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [] } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], "CapMap": { "example.com/cap/test": [] } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "example.com/cap/test", "Values": [] }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "example.com/cap/test", "Values": [] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [] } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], "CapMap": { "example.com/cap/test": [] } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "example.com/cap/test", "Values": [] }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "example.com/cap/test", "Values": [] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [] } + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { "Dsts": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], "CapMap": { "example.com/cap/test": [] } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.8.15/32", "Cap": "example.com/cap/test", "Values": [] }, + { "Dst": "fd7a:115c:a1e0::5b37:80f/128", "Cap": "example.com/cap/test", "Values": [] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [] } + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], "CapMap": { "example.com/cap/test": [] } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], "CapMap": { "example.com/cap/test": [] } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "example.com/cap/test", "Values": [] }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "example.com/cap/test", "Values": [] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [] } + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], "CapMap": { "example.com/cap/test": [] } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "example.com/cap/test", "Values": [] }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "example.com/cap/test", "Values": [] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [] } + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], "CapMap": { "example.com/cap/test": [] } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "example.com/cap/test", "Values": [] }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "example.com/cap/test", "Values": [] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [] } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-H3.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-H3.json new file mode 100644 index 00000000..af9ebd33 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-H3.json @@ -0,0 +1,48 @@ +{ + "test_id": "GRANT-H3", + "description": "", + "timestamp": "2026-02-23T00:36:53Z", + "error": true, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_h3.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "ip": [] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["*"], "ip": [] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "ip and app can not both be empty" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-H4.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-H4.json new file mode 100644 index 00000000..c761dac6 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-H4.json @@ -0,0 +1,486 @@ +{ + "test_id": "GRANT-H4", + "timestamp": "2026-02-23T00:36:53Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_h4.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": [], + "dst": ["*"], + "app": { + "example.com/cap/test": [{}] + } + } + ] + }, + "grants_section": [{ "src": [], "dst": ["*"], "app": { "example.com/cap/test": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-H5.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-H5.json new file mode 100644 index 00000000..d5e5bb55 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-H5.json @@ -0,0 +1,486 @@ +{ + "test_id": "GRANT-H5", + "timestamp": "2026-02-23T00:37:10Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_h5.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": [], + "app": { + "example.com/cap/test": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": [], "app": { "example.com/cap/test": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-H6.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-H6.json new file mode 100644 index 00000000..8b2f46da --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-H6.json @@ -0,0 +1,651 @@ +{ + "test_id": "GRANT-H6", + "timestamp": "2026-02-23T00:37:27Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_h6.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["group:empty"], + "dst": ["*"], + "app": { + "example.com/cap/test": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["group:empty"], "dst": ["*"], "app": { "example.com/cap/test": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [], + "CapGrant": [ + { "Dsts": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], "CapMap": { "example.com/cap/test": [{}] } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.8.15/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::5b37:80f/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-H7.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-H7.json new file mode 100644 index 00000000..cfe2ffef --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-H7.json @@ -0,0 +1,50 @@ +{ + "test_id": "GRANT-H7", + "description": "", + "timestamp": "2026-02-23T00:37:44Z", + "error": true, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_h7.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:nonexistent"], + "dst": ["*"], + "app": { + "example.com/cap/test": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["tag:nonexistent"], "dst": ["*"], "app": { "example.com/cap/test": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "src=tag not found: \"tag:nonexistent\"" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-H8.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-H8.json new file mode 100644 index 00000000..4a0a0b80 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-H8.json @@ -0,0 +1,47 @@ +{ + "test_id": "GRANT-H8", + "description": "", + "timestamp": "2026-02-23T00:37:44Z", + "error": true, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_h8.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "ip and app can not both be empty" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-H9.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-H9.json new file mode 100644 index 00000000..04bc4a01 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-H9.json @@ -0,0 +1,50 @@ +{ + "test_id": "GRANT-H9", + "description": "", + "timestamp": "2026-02-23T00:37:44Z", + "error": true, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_h9.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["autogroup:self"], + "app": { + "example.com/cap/test": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["autogroup:self"], "app": { "example.com/cap/test": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "autogroup:self can only be used with users, groups, or supported autogroups" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-I1.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-I1.json new file mode 100644 index 00000000..35bb0f16 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-I1.json @@ -0,0 +1,1020 @@ +{ + "test_id": "GRANT-I1", + "timestamp": "2026-02-23T00:37:45Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_i1.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["10.33.0.0/16"], + "via": ["tag:router"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["10.33.0.0/16"], "via": ["tag:router"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "10.33.0.0/16", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [{ "Net": "10.33.0.0/16", "Ports": { "First": 0, "Last": 65535 } }], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-I2.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-I2.json new file mode 100644 index 00000000..7056185a --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-I2.json @@ -0,0 +1,1021 @@ +{ + "test_id": "GRANT-I2", + "timestamp": "2026-02-23T00:38:02Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_i2.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["10.33.0.0/16"], + "via": ["tag:router"], + "ip": ["tcp:80"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["10.33.0.0/16"], "via": ["tag:router"], "ip": ["tcp:80"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "10.33.0.0/16", "Ports": { "First": 80, "Last": 80 } }], + "IPProto": [6] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [{ "Net": "10.33.0.0/16", "Ports": { "First": 80, "Last": 80 } }], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-I3.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-I3.json new file mode 100644 index 00000000..d6ecfb0d --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-I3.json @@ -0,0 +1,1020 @@ +{ + "test_id": "GRANT-I3", + "timestamp": "2026-02-23T00:38:18Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_i3.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["10.33.0.0/16"], + "via": ["tag:router", "tag:exit"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["10.33.0.0/16"], "via": ["tag:router", "tag:exit"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "10.33.0.0/16", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [{ "Net": "10.33.0.0/16", "Ports": { "First": 0, "Last": 65535 } }], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-I4.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-I4.json new file mode 100644 index 00000000..58a2dea9 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-I4.json @@ -0,0 +1,49 @@ +{ + "test_id": "GRANT-I4", + "description": "", + "timestamp": "2026-02-23T00:38:35Z", + "error": true, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_i4.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["10.33.0.0/16"], + "via": ["autogroup:tagged"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["10.33.0.0/16"], "via": ["autogroup:tagged"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "via can only be a tag" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-J1.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-J1.json new file mode 100644 index 00000000..58267c8b --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-J1.json @@ -0,0 +1,1020 @@ +{ + "test_id": "GRANT-J1", + "timestamp": "2026-02-23T00:38:36Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_j1.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["tcp:22"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["tag:server"], "ip": ["tcp:22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ], + "IPProto": [6] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-J2.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-J2.json new file mode 100644 index 00000000..3769ee91 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-J2.json @@ -0,0 +1,1020 @@ +{ + "test_id": "GRANT-J2", + "timestamp": "2026-02-23T00:38:53Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_j2.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["udp:53"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["tag:server"], "ip": ["udp:53"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 53, "Last": 53 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 53, "Last": 53 } } + ], + "IPProto": [17] + } + ], + "packet_filter_matches": [ + { + "IPProto": [17], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 53, "Last": 53 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 53, "Last": 53 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-J3.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-J3.json new file mode 100644 index 00000000..e6f655d1 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-J3.json @@ -0,0 +1,1019 @@ +{ + "test_id": "GRANT-J3", + "timestamp": "2026-02-23T00:39:09Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_j3.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["tag:server"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-J4.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-J4.json new file mode 100644 index 00000000..7a5cf65b --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-J4.json @@ -0,0 +1,1063 @@ +{ + "test_id": "GRANT-J4", + "timestamp": "2026-02-23T00:39:26Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_j4.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["tcp:80", "udp:53", "tcp:443"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["tag:server"], "ip": ["tcp:80", "udp:53", "tcp:443"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.108.74.26", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 443, "Last": 443 } } + ], + "IPProto": [6] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 53, "Last": 53 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 53, "Last": 53 } } + ], + "IPProto": [17] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + }, + { + "IPProto": [17], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 53, "Last": 53 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 53, "Last": 53 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-J5.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-J5.json new file mode 100644 index 00000000..42b88589 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-J5.json @@ -0,0 +1,1020 @@ +{ + "test_id": "GRANT-J5", + "timestamp": "2026-02-23T00:39:43Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_j5.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["tcp:80-443"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["tag:server"], "ip": ["tcp:80-443"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 443 } } + ], + "IPProto": [6] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 443 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-J6.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-J6.json new file mode 100644 index 00000000..2332d3fa --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-J6.json @@ -0,0 +1,1019 @@ +{ + "test_id": "GRANT-J6", + "timestamp": "2026-02-23T00:40:00Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_j6.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["80"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["tag:server"], "ip": ["80"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 80 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-J7.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-J7.json new file mode 100644 index 00000000..8b574e92 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-J7.json @@ -0,0 +1,48 @@ +{ + "test_id": "GRANT-J7", + "description": "", + "timestamp": "2026-02-23T00:40:17Z", + "error": true, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_j7.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["icmp"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["tag:server"], "ip": ["icmp"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "port range \"icmp\": invalid first integer" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K1.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K1.json new file mode 100644 index 00000000..cd7d847c --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K1.json @@ -0,0 +1,2775 @@ +{ + "test_id": "GRANT-K1", + "timestamp": "2026-02-23T02:53:51Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k1.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "acls": [ + { + "action": "accept", + "src": ["*"], + "dst": ["*:*"] + } + ] + }, + "grants_section": null, + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K10.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K10.json new file mode 100644 index 00000000..0bfdd4b4 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K10.json @@ -0,0 +1,50 @@ +{ + "test_id": "GRANT-K10", + "description": "", + "timestamp": "2026-02-23T02:55:30Z", + "error": true, + "input": { + "policy_file": "grant_policies/grant_k10.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "tailscale.com/cap/funnel": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["*"], "app": { "tailscale.com/cap/funnel": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "capability name must not be in the tailscale.com domain" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K11.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K11.json new file mode 100644 index 00000000..e6f66444 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K11.json @@ -0,0 +1,4090 @@ +{ + "test_id": "GRANT-K11", + "timestamp": "2026-02-23T02:55:39Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k11.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "tailscale.com/cap/webui": [{}], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/kubernetes": [ + { + "impersonate": { + "groups": ["system:masters"] + } + } + ], + "tailscale.com/cap/drive": [ + { + "shares": ["*"], + "access": "rw" + } + ] + } + } + ] + }, + "grants_section": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "tailscale.com/cap/webui": [{}], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] + } + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/webui": [{}] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "tailscale.com/cap/relay-target": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.85.66.106/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "100.85.66.106/32", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + }, + { "Dst": "100.85.66.106/32", "Cap": "tailscale.com/cap/relay", "Values": [{}] }, + { "Dst": "100.85.66.106/32", "Cap": "tailscale.com/cap/webui", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "tailscale.com/cap/relay", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "tailscale.com/cap/webui", "Values": [{}] }, + { + "Dst": "fd7a:115c:a1e0::7c37:426a/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::7c37:426a/128", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "tailscale.com/cap/relay-target", "Values": null }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "tailscale.com/cap/relay-target", "Values": null } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/webui": [{}] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "tailscale.com/cap/relay-target": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.92.142.61/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "100.92.142.61/32", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + }, + { "Dst": "100.92.142.61/32", "Cap": "tailscale.com/cap/relay", "Values": [{}] }, + { "Dst": "100.92.142.61/32", "Cap": "tailscale.com/cap/webui", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "tailscale.com/cap/webui", "Values": [{}] }, + { + "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "tailscale.com/cap/relay", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "tailscale.com/cap/relay-target", "Values": null }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "tailscale.com/cap/relay-target", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/webui": [{}] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "tailscale.com/cap/relay-target": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.83.200.69/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "100.83.200.69/32", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + }, + { "Dst": "100.83.200.69/32", "Cap": "tailscale.com/cap/relay", "Values": [{}] }, + { "Dst": "100.83.200.69/32", "Cap": "tailscale.com/cap/webui", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "tailscale.com/cap/webui", "Values": [{}] }, + { + "Dst": "fd7a:115c:a1e0::c537:c845/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::c537:c845/128", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "tailscale.com/cap/relay", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "tailscale.com/cap/relay-target", "Values": null }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "tailscale.com/cap/relay-target", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/webui": [{}] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "CapMap": { "tailscale.com/cap/relay-target": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.103.8.15/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "100.103.8.15/32", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + }, + { "Dst": "100.103.8.15/32", "Cap": "tailscale.com/cap/relay", "Values": [{}] }, + { "Dst": "100.103.8.15/32", "Cap": "tailscale.com/cap/webui", "Values": [{}] }, + { + "Dst": "fd7a:115c:a1e0::5b37:80f/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::5b37:80f/128", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + }, + { "Dst": "fd7a:115c:a1e0::5b37:80f/128", "Cap": "tailscale.com/cap/relay", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::5b37:80f/128", "Cap": "tailscale.com/cap/webui", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.8.15/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::5b37:80f/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.8.15/32", "Cap": "tailscale.com/cap/relay-target", "Values": null }, + { "Dst": "fd7a:115c:a1e0::5b37:80f/128", "Cap": "tailscale.com/cap/relay-target", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/webui": [{}] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "tailscale.com/cap/relay-target": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.108.74.26/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "100.108.74.26/32", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + }, + { "Dst": "100.108.74.26/32", "Cap": "tailscale.com/cap/relay", "Values": [{}] }, + { "Dst": "100.108.74.26/32", "Cap": "tailscale.com/cap/webui", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "tailscale.com/cap/relay", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "tailscale.com/cap/webui", "Values": [{}] }, + { + "Dst": "fd7a:115c:a1e0::b901:4a87/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::b901:4a87/128", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "tailscale.com/cap/relay-target", "Values": null }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "tailscale.com/cap/relay-target", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/webui": [{}] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "tailscale.com/cap/relay-target": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.110.121.96/32", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + }, + { "Dst": "100.110.121.96/32", "Cap": "tailscale.com/cap/relay", "Values": [{}] }, + { "Dst": "100.110.121.96/32", "Cap": "tailscale.com/cap/webui", "Values": [{}] }, + { + "Dst": "100.110.121.96/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::1737:7960/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::1737:7960/128", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "tailscale.com/cap/relay", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "tailscale.com/cap/webui", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "tailscale.com/cap/relay-target", "Values": null }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "tailscale.com/cap/relay-target", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/webui": [{}] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "tailscale.com/cap/relay-target": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "tailscale.com/cap/webui", "Values": [{}] }, + { + "Dst": "100.103.90.82/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "100.103.90.82/32", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + }, + { "Dst": "100.103.90.82/32", "Cap": "tailscale.com/cap/relay", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "tailscale.com/cap/webui", "Values": [{}] }, + { + "Dst": "fd7a:115c:a1e0::9e37:5a52/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::9e37:5a52/128", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "tailscale.com/cap/relay", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "tailscale.com/cap/relay-target", "Values": null }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "tailscale.com/cap/relay-target", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/webui": [{}] + } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "tailscale.com/cap/relay-target": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "tailscale.com/cap/relay", "Values": [{}] }, + { "Dst": "100.90.199.68/32", "Cap": "tailscale.com/cap/webui", "Values": [{}] }, + { + "Dst": "100.90.199.68/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "100.90.199.68/32", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + }, + { + "Dst": "fd7a:115c:a1e0::2d01:c747/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::2d01:c747/128", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "tailscale.com/cap/relay", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "tailscale.com/cap/webui", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "tailscale.com/cap/relay-target", "Values": null }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "tailscale.com/cap/relay-target", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { + "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }], + "tailscale.com/cap/drive-sharer": null, + "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }], + "tailscale.com/cap/relay": [{}], + "tailscale.com/cap/relay-target": null, + "tailscale.com/cap/webui": [{}] + } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K12.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K12.json new file mode 100644 index 00000000..4ab1fe01 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K12.json @@ -0,0 +1,999 @@ +{ + "test_id": "GRANT-K12", + "timestamp": "2026-02-23T02:55:55Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k12.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["10.33.0.0/16"], + "via": ["tag:router"], + "app": { + "example.com/cap/subnet-access": [ + { + "level": "admin" + } + ] + } + } + ] + }, + "grants_section": [ + { + "src": ["*"], + "dst": ["10.33.0.0/16"], + "via": ["tag:router"], + "app": { "example.com/cap/subnet-access": [{ "level": "admin" }] } + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K13.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K13.json new file mode 100644 index 00000000..8ec69b89 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K13.json @@ -0,0 +1,1036 @@ +{ + "test_id": "GRANT-K13", + "timestamp": "2026-02-23T02:56:12Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k13.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["10.33.0.0/16"], + "via": ["tag:router"], + "ip": ["tcp:80"], + "app": { + "example.com/cap/subnet-access": [ + { + "level": "admin" + } + ] + } + } + ] + }, + "grants_section": [ + { + "src": ["*"], + "dst": ["10.33.0.0/16"], + "via": ["tag:router"], + "ip": ["tcp:80"], + "app": { "example.com/cap/subnet-access": [{ "level": "admin" }] } + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "10.33.0.0/16", "Ports": { "First": 80, "Last": 80 } }], + "IPProto": [6] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [{ "Net": "10.33.0.0/16", "Ports": { "First": 80, "Last": 80 } }], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K14.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K14.json new file mode 100644 index 00000000..4633d4a1 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K14.json @@ -0,0 +1,574 @@ +{ + "test_id": "GRANT-K14", + "timestamp": "2026-02-23T02:56:28Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k14.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["fd7a:115c:a1e0::c537:c845"], + "dst": ["tag:server"], + "ip": ["tcp:22"] + } + ] + }, + "grants_section": [{ "src": ["fd7a:115c:a1e0::c537:c845"], "dst": ["tag:server"], "ip": ["tcp:22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ], + "IPProto": [6] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": ["fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K15.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K15.json new file mode 100644 index 00000000..d422c02a --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K15.json @@ -0,0 +1,1014 @@ +{ + "test_id": "GRANT-K15", + "timestamp": "2026-02-23T02:56:45Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k15.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["fd7a:115c:a1e0::b901:4a87"], + "ip": ["tcp:22"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["fd7a:115c:a1e0::b901:4a87"], "ip": ["tcp:22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } }], + "IPProto": [6] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [{ "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } }], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K16.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K16.json new file mode 100644 index 00000000..38783969 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K16.json @@ -0,0 +1,2801 @@ +{ + "test_id": "GRANT-K16", + "timestamp": "2026-02-23T02:57:02Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k16.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["tcp:22"] + }, + { + "src": ["*"], + "dst": ["*"], + "ip": ["*"] + } + ] + }, + "grants_section": [ + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["tcp:22"] }, + { "src": ["*"], "dst": ["*"], "ip": ["*"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ], + "IPProto": [6] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K17.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K17.json new file mode 100644 index 00000000..6b32606f --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K17.json @@ -0,0 +1,2801 @@ +{ + "test_id": "GRANT-K17", + "timestamp": "2026-02-23T02:57:18Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k17.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "ip": ["*"] + }, + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["tcp:22"] + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["*"], "ip": ["*"] }, + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["tcp:22"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + }, + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ], + "IPProto": [6] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K18.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K18.json new file mode 100644 index 00000000..e750a145 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K18.json @@ -0,0 +1,3130 @@ +{ + "test_id": "GRANT-K18", + "timestamp": "2026-02-23T02:57:35Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k18.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "example.com/cap/one": [{}] + } + }, + { + "src": ["*"], + "dst": ["*"], + "app": { + "example.com/cap/two": [ + { + "v": 42 + } + ] + } + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["*"], "app": { "example.com/cap/one": [{}] } }, + { "src": ["*"], "dst": ["*"], "app": { "example.com/cap/two": [{ "v": 42 }] } } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], "CapMap": { "example.com/cap/one": [{}] } } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "example.com/cap/two": [{ "v": 42 }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "example.com/cap/one", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "example.com/cap/two", "Values": [{ "v": 42 }] }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "example.com/cap/two", "Values": [{ "v": 42 }] } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], "CapMap": { "example.com/cap/one": [{}] } } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "example.com/cap/two": [{ "v": 42 }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "example.com/cap/one", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "example.com/cap/two", "Values": [{ "v": 42 }] }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "example.com/cap/two", "Values": [{ "v": 42 }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], "CapMap": { "example.com/cap/one": [{}] } } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "example.com/cap/two": [{ "v": 42 }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "example.com/cap/one", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "example.com/cap/two", "Values": [{ "v": 42 }] }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "example.com/cap/two", "Values": [{ "v": 42 }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { "Dsts": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], "CapMap": { "example.com/cap/one": [{}] } } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "CapMap": { "example.com/cap/two": [{ "v": 42 }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.8.15/32", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::5b37:80f/128", "Cap": "example.com/cap/one", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.8.15/32", "Cap": "example.com/cap/two", "Values": [{ "v": 42 }] }, + { "Dst": "fd7a:115c:a1e0::5b37:80f/128", "Cap": "example.com/cap/two", "Values": [{ "v": 42 }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], "CapMap": { "example.com/cap/one": [{}] } } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/two": [{ "v": 42 }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/one", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/two", "Values": [{ "v": 42 }] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/two", "Values": [{ "v": 42 }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "example.com/cap/one": [{}] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "example.com/cap/two": [{ "v": 42 }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "example.com/cap/one", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "example.com/cap/two", "Values": [{ "v": 42 }] }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "example.com/cap/two", "Values": [{ "v": 42 }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], "CapMap": { "example.com/cap/one": [{}] } } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "example.com/cap/two": [{ "v": 42 }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "example.com/cap/one", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "example.com/cap/two", "Values": [{ "v": 42 }] }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "example.com/cap/two", "Values": [{ "v": 42 }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], "CapMap": { "example.com/cap/one": [{}] } } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "example.com/cap/two": [{ "v": 42 }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "example.com/cap/one", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "example.com/cap/one", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "example.com/cap/two", "Values": [{ "v": 42 }] }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "example.com/cap/two", "Values": [{ "v": 42 }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/one": [{}], "example.com/cap/two": [{ "v": 42 }] } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K19.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K19.json new file mode 100644 index 00000000..2d81c8ec --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K19.json @@ -0,0 +1,3155 @@ +{ + "test_id": "GRANT-K19", + "timestamp": "2026-02-23T02:57:52Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k19.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "example.com/cap/test": [ + { + "v": 1 + } + ] + } + }, + { + "src": ["*"], + "dst": ["*"], + "app": { + "example.com/cap/test": [ + { + "v": 2 + } + ] + } + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["*"], "app": { "example.com/cap/test": [{ "v": 1 }] } }, + { "src": ["*"], "dst": ["*"], "app": { "example.com/cap/test": [{ "v": 2 }] } } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "example.com/cap/test": [{ "v": 1 }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "example.com/cap/test": [{ "v": 2 }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "example.com/cap/test", "Values": [{ "v": 1 }] }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "example.com/cap/test", "Values": [{ "v": 1 }] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "example.com/cap/test", "Values": [{ "v": 2 }] }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "example.com/cap/test", "Values": [{ "v": 2 }] } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "example.com/cap/test": [{ "v": 1 }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "example.com/cap/test": [{ "v": 2 }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "example.com/cap/test", "Values": [{ "v": 1 }] }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "example.com/cap/test", "Values": [{ "v": 1 }] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "example.com/cap/test", "Values": [{ "v": 2 }] }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "example.com/cap/test", "Values": [{ "v": 2 }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "example.com/cap/test": [{ "v": 1 }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "example.com/cap/test": [{ "v": 2 }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "example.com/cap/test", "Values": [{ "v": 1 }] }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "example.com/cap/test", "Values": [{ "v": 1 }] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "example.com/cap/test", "Values": [{ "v": 2 }] }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "example.com/cap/test", "Values": [{ "v": 2 }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "CapMap": { "example.com/cap/test": [{ "v": 1 }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "CapMap": { "example.com/cap/test": [{ "v": 2 }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.8.15/32", "Cap": "example.com/cap/test", "Values": [{ "v": 1 }] }, + { "Dst": "fd7a:115c:a1e0::5b37:80f/128", "Cap": "example.com/cap/test", "Values": [{ "v": 1 }] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.8.15/32", "Cap": "example.com/cap/test", "Values": [{ "v": 2 }] }, + { "Dst": "fd7a:115c:a1e0::5b37:80f/128", "Cap": "example.com/cap/test", "Values": [{ "v": 2 }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{ "v": 1 }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{ "v": 2 }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{ "v": 1 }] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{ "v": 1 }] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{ "v": 2 }] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{ "v": 2 }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "example.com/cap/test": [{ "v": 1 }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "example.com/cap/test": [{ "v": 2 }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "example.com/cap/test", "Values": [{ "v": 1 }] }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "example.com/cap/test", "Values": [{ "v": 1 }] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "example.com/cap/test", "Values": [{ "v": 2 }] }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "example.com/cap/test", "Values": [{ "v": 2 }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "example.com/cap/test": [{ "v": 1 }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "example.com/cap/test": [{ "v": 2 }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "example.com/cap/test", "Values": [{ "v": 1 }] }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "example.com/cap/test", "Values": [{ "v": 1 }] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "example.com/cap/test", "Values": [{ "v": 2 }] }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "example.com/cap/test", "Values": [{ "v": 2 }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "example.com/cap/test": [{ "v": 1 }] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "example.com/cap/test": [{ "v": 2 }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "example.com/cap/test", "Values": [{ "v": 1 }] }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "example.com/cap/test", "Values": [{ "v": 1 }] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "example.com/cap/test", "Values": [{ "v": 2 }] }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "example.com/cap/test", "Values": [{ "v": 2 }] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{ "v": 1 }, { "v": 2 }] } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K2.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K2.json new file mode 100644 index 00000000..9f796a0f --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K2.json @@ -0,0 +1,2775 @@ +{ + "test_id": "GRANT-K2", + "timestamp": "2026-02-23T02:54:08Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k2.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["*"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K20.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K20.json new file mode 100644 index 00000000..e4f7562b --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K20.json @@ -0,0 +1,653 @@ +{ + "test_id": "GRANT-K20", + "timestamp": "2026-02-23T02:58:08Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k20.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["user:*@passkey"], + "dst": ["tag:server"], + "ip": ["tcp:22"] + } + ] + }, + "grants_section": [{ "src": ["user:*@passkey"], "dst": ["tag:server"], "ip": ["tcp:22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.103.90.82", "100.90.199.68", "fd7a:115c:a1e0::2d01:c747", "fd7a:115c:a1e0::9e37:5a52"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ], + "IPProto": [6] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "100.103.90.82/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K21.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K21.json new file mode 100644 index 00000000..78b1783a --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K21.json @@ -0,0 +1,1506 @@ +{ + "test_id": "GRANT-K21", + "timestamp": "2026-02-23T02:58:30Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k21.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["user:*@passkey"], + "ip": ["tcp:22"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["user:*@passkey"], "ip": ["tcp:22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.103.90.82", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::9e37:5a52", "Ports": { "First": 22, "Last": 22 } } + ], + "IPProto": [6] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.103.90.82/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::9e37:5a52/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.90.199.68", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 22, "Last": 22 } } + ], + "IPProto": [6] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.90.199.68/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K22.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K22.json new file mode 100644 index 00000000..5b1c93c5 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K22.json @@ -0,0 +1,1019 @@ +{ + "test_id": "GRANT-K22", + "timestamp": "2026-02-23T02:58:46Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k22.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["47"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["tag:server"], "ip": ["47"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 47, "Last": 47 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 47, "Last": 47 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 47, "Last": 47 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 47, "Last": 47 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K23.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K23.json new file mode 100644 index 00000000..bfb6153a --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K23.json @@ -0,0 +1,48 @@ +{ + "test_id": "GRANT-K23", + "description": "", + "timestamp": "2026-02-23T02:59:03Z", + "error": true, + "input": { + "policy_file": "grant_policies/grant_k23.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["tcp:0"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["tag:server"], "ip": ["tcp:0"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "port range \"0\": first port must be >0, or use '*' for wildcard" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K24.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K24.json new file mode 100644 index 00000000..ba1c6b11 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K24.json @@ -0,0 +1,2817 @@ +{ + "test_id": "GRANT-K24", + "timestamp": "2026-02-23T02:59:03Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k24.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "example.com/a/b/c/d/e/f": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["*"], "app": { "example.com/a/b/c/d/e/f": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "example.com/a/b/c/d/e/f", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "example.com/a/b/c/d/e/f", "Values": [{}] } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "example.com/a/b/c/d/e/f", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "example.com/a/b/c/d/e/f", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "example.com/a/b/c/d/e/f", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "example.com/a/b/c/d/e/f", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.8.15/32", "Cap": "example.com/a/b/c/d/e/f", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::5b37:80f/128", "Cap": "example.com/a/b/c/d/e/f", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/a/b/c/d/e/f", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/a/b/c/d/e/f", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "example.com/a/b/c/d/e/f", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "example.com/a/b/c/d/e/f", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "example.com/a/b/c/d/e/f", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "example.com/a/b/c/d/e/f", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "example.com/a/b/c/d/e/f", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "example.com/a/b/c/d/e/f", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/a/b/c/d/e/f": [{}] } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K25.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K25.json new file mode 100644 index 00000000..7067a0ea --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K25.json @@ -0,0 +1,2817 @@ +{ + "test_id": "GRANT-K25", + "timestamp": "2026-02-23T02:59:19Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k25.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "my-company.internal/cap/access": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["*"], "app": { "my-company.internal/cap/access": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "my-company.internal/cap/access": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "my-company.internal/cap/access", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::7c37:426a/128", "Cap": "my-company.internal/cap/access", "Values": [{}] } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "my-company.internal/cap/access": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "my-company.internal/cap/access", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", "Cap": "my-company.internal/cap/access", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "CapMap": { "my-company.internal/cap/access": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.83.200.69/32", "Cap": "my-company.internal/cap/access", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::c537:c845/128", "Cap": "my-company.internal/cap/access", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "CapMap": { "my-company.internal/cap/access": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.8.15/32", "Cap": "my-company.internal/cap/access", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::5b37:80f/128", "Cap": "my-company.internal/cap/access", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "my-company.internal/cap/access": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "my-company.internal/cap/access", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "my-company.internal/cap/access", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "my-company.internal/cap/access": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "my-company.internal/cap/access", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "my-company.internal/cap/access", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "my-company.internal/cap/access": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "my-company.internal/cap/access", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "my-company.internal/cap/access", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "my-company.internal/cap/access": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "my-company.internal/cap/access", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "my-company.internal/cap/access", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "my-company.internal/cap/access": [{}] } + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K26.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K26.json new file mode 100644 index 00000000..848b14f7 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K26.json @@ -0,0 +1,2036 @@ +{ + "test_id": "GRANT-K26", + "timestamp": "2026-02-23T02:59:36Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k26.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["autogroup:member", "autogroup:tagged"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:member"], "dst": ["autogroup:member", "autogroup:tagged"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [ + { "IP": "100.85.66.106", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::7c37:426a", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.85.66.106/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::7c37:426a/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [ + { "IP": "100.92.142.61", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::3e37:8e3d", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.92.142.61/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::3e37:8e3d/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [ + { "IP": "100.83.200.69", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::c537:c845", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.83.200.69/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::c537:c845/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [ + { "IP": "100.103.8.15", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.103.8.15/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [ + { "IP": "100.110.121.96", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::1737:7960", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.110.121.96/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::1737:7960/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [ + { "IP": "100.103.90.82", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::9e37:5a52", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.103.90.82/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::9e37:5a52/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [ + { "IP": "100.90.199.68", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.90.199.68/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K27.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K27.json new file mode 100644 index 00000000..2b6b25c5 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K27.json @@ -0,0 +1,551 @@ +{ + "test_id": "GRANT-K27", + "timestamp": "2026-02-23T02:59:53Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k27.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["autogroup:self"], + "app": { + "example.com/cap/self-service": [{}] + } + } + ] + }, + "grants_section": [ + { "src": ["autogroup:member"], "dst": ["autogroup:self"], "app": { "example.com/cap/self-service": [{}] } } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.110.121.96", "fd7a:115c:a1e0::1737:7960"], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "example.com/cap/self-service": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "example.com/cap/self-service", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "example.com/cap/self-service", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.103.90.82", "fd7a:115c:a1e0::9e37:5a52"], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "example.com/cap/self-service": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "example.com/cap/self-service", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "example.com/cap/self-service", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "example.com/cap/self-service": [{}] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "example.com/cap/self-service", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "example.com/cap/self-service", "Values": [{}] } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K28.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K28.json new file mode 100644 index 00000000..8cbfe2a6 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K28.json @@ -0,0 +1,694 @@ +{ + "test_id": "GRANT-K28", + "timestamp": "2026-02-23T03:00:09Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k28.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["autogroup:self"], + "ip": ["*"], + "app": { + "tailscale.com/cap/drive": [ + { + "shares": ["*"], + "access": "rw" + } + ] + } + } + ] + }, + "grants_section": [ + { + "src": ["autogroup:member"], + "dst": ["autogroup:self"], + "ip": ["*"], + "app": { "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] } + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.110.121.96", "fd7a:115c:a1e0::1737:7960"], + "DstPorts": [ + { "IP": "100.110.121.96", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::1737:7960", "Ports": { "First": 0, "Last": 65535 } } + ] + }, + { + "SrcIPs": ["100.110.121.96", "fd7a:115c:a1e0::1737:7960"], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] } + } + ] + }, + { + "SrcIPs": ["100.110.121.96", "fd7a:115c:a1e0::1737:7960"], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.110.121.96/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::1737:7960/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.110.121.96/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::1737:7960/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.103.90.82", "fd7a:115c:a1e0::9e37:5a52"], + "DstPorts": [ + { "IP": "100.103.90.82", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::9e37:5a52", "Ports": { "First": 0, "Last": 65535 } } + ] + }, + { + "SrcIPs": ["100.103.90.82", "fd7a:115c:a1e0::9e37:5a52"], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] } + } + ] + }, + { + "SrcIPs": ["100.103.90.82", "fd7a:115c:a1e0::9e37:5a52"], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.103.90.82/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::9e37:5a52/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.103.90.82/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::9e37:5a52/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [ + { "IP": "100.90.199.68", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 0, "Last": 65535 } } + ] + }, + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] } + } + ] + }, + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.90.199.68/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.90.199.68/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::2d01:c747/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K29.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K29.json new file mode 100644 index 00000000..4f06aabd --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K29.json @@ -0,0 +1,478 @@ +{ + "test_id": "GRANT-K29", + "timestamp": "2026-02-23T03:00:26Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k29.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [] + }, + "grants_section": [], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K3.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K3.json new file mode 100644 index 00000000..1329b0f1 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K3.json @@ -0,0 +1,2824 @@ +{ + "test_id": "GRANT-K3", + "timestamp": "2026-02-23T02:54:24Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k3.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "acls": [ + { + "action": "accept", + "src": ["*"], + "dst": ["*:*"] + } + ], + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "app": { + "example.com/cap/test": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["tag:server"], "app": { "example.com/cap/test": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/test": [{}] } + } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/test", "Values": [{}] }, + { "Dst": "fd7a:115c:a1e0::b901:4a87/128", "Cap": "example.com/cap/test", "Values": [{}] } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/test": [{}] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/test": [{}] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K30.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K30.json new file mode 100644 index 00000000..c627a008 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K30.json @@ -0,0 +1,51 @@ +{ + "test_id": "GRANT-K30", + "description": "", + "timestamp": "2026-02-23T03:00:42Z", + "error": true, + "input": { + "policy_file": "grant_policies/grant_k30.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["10.33.0.0/16"], + "via": ["tag:router", "tag:nonexistent"], + "ip": ["*"] + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["10.33.0.0/16"], "via": ["tag:router", "tag:nonexistent"], "ip": ["*"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "tag \"tag:nonexistent\" not found" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K4.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K4.json new file mode 100644 index 00000000..67c8d578 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K4.json @@ -0,0 +1,1048 @@ +{ + "test_id": "GRANT-K4", + "timestamp": "2026-02-23T02:54:40Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k4.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "acls": [ + { + "action": "accept", + "src": ["tag:client"], + "dst": ["tag:server:22"] + } + ], + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["tcp:80", "tcp:443"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["tag:server"], "ip": ["tcp:80", "tcp:443"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.108.74.26", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 443, "Last": 443 } } + ], + "IPProto": [6] + }, + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K5.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K5.json new file mode 100644 index 00000000..2a864c2a --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K5.json @@ -0,0 +1,1391 @@ +{ + "test_id": "GRANT-K5", + "timestamp": "2026-02-23T02:54:57Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k5.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "acls": [ + { + "action": "accept", + "src": ["tag:client"], + "dst": ["tag:server:22"] + } + ], + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["tag:server"], + "app": { + "tailscale.com/cap/kubernetes": [ + { + "impersonate": { + "groups": ["system:masters"] + } + } + ] + } + }, + { + "src": ["*"], + "dst": ["10.33.0.0/16"], + "via": ["tag:router"], + "ip": ["*"] + } + ] + }, + "grants_section": [ + { + "src": ["autogroup:member"], + "dst": ["tag:server"], + "app": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + }, + { "src": ["*"], "dst": ["10.33.0.0/16"], "via": ["tag:router"], "ip": ["*"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "10.33.0.0/16", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [{ "Net": "10.33.0.0/16", "Ports": { "First": 0, "Last": 65535 } }], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + ] + }, + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.108.74.26/32", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + }, + { + "Dst": "fd7a:115c:a1e0::b901:4a87/128", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + } + ] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K6.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K6.json new file mode 100644 index 00000000..e013dd38 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K6.json @@ -0,0 +1,999 @@ +{ + "test_id": "GRANT-K6", + "timestamp": "2026-02-23T02:55:13Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "grant_policies/grant_k6.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:danger-all"], + "dst": ["tag:server"], + "ip": ["tcp:22"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:danger-all"], "dst": ["tag:server"], "ip": ["tcp:22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["*"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ], + "IPProto": [6] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": ["0.0.0.0/0", "::/0"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K7.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K7.json new file mode 100644 index 00000000..0d244702 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K7.json @@ -0,0 +1,48 @@ +{ + "test_id": "GRANT-K7", + "description": "", + "timestamp": "2026-02-23T02:55:29Z", + "error": true, + "input": { + "policy_file": "grant_policies/grant_k7.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["autogroup:danger-all"], + "ip": ["tcp:22"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["autogroup:danger-all"], "ip": ["tcp:22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "cannot use autogroup:danger-all as a dst" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K8.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K8.json new file mode 100644 index 00000000..1316d682 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K8.json @@ -0,0 +1,48 @@ +{ + "test_id": "GRANT-K8", + "description": "", + "timestamp": "2026-02-23T02:55:29Z", + "error": true, + "input": { + "policy_file": "grant_policies/grant_k8.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:danger-all"], + "dst": ["autogroup:danger-all"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:danger-all"], "dst": ["autogroup:danger-all"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "cannot use autogroup:danger-all as a dst" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-K9.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-K9.json new file mode 100644 index 00000000..4488362b --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-K9.json @@ -0,0 +1,50 @@ +{ + "test_id": "GRANT-K9", + "description": "", + "timestamp": "2026-02-23T02:55:30Z", + "error": true, + "input": { + "policy_file": "grant_policies/grant_k9.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "app": { + "tailscale.com/cap/ingress": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["*"], "app": { "tailscale.com/cap/ingress": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "capability name must not be in the tailscale.com domain" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P01_1.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P01_1.json new file mode 100644 index 00000000..fa0ff2f0 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P01_1.json @@ -0,0 +1,2775 @@ +{ + "test_id": "GRANT-P01_1", + "timestamp": "2026-02-23T00:42:55Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p01_1.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["*"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P01_2.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P01_2.json new file mode 100644 index 00000000..593dd4b2 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P01_2.json @@ -0,0 +1,1083 @@ +{ + "test_id": "GRANT-P01_2", + "timestamp": "2026-02-23T00:43:12Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p01_2.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["100.90.199.68"], + "dst": ["*"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["100.90.199.68"], "dst": ["*"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.90.199.68"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.90.199.68"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.90.199.68"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.90.199.68"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.90.199.68"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.90.199.68"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.90.199.68"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.90.199.68"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P01_3.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P01_3.json new file mode 100644 index 00000000..0fe6a04e --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P01_3.json @@ -0,0 +1,588 @@ +{ + "test_id": "GRANT-P01_3", + "timestamp": "2026-02-23T00:43:29Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p01_3.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["100.64.0.0/16"], + "dst": ["*"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["100.64.0.0/16"], "dst": ["*"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.64.0.0/16"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.64.0.0/16"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.64.0.0/16"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.64.0.0/16"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.64.0.0/16"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.64.0.0/16"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.64.0.0/16"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.64.0.0/16"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.64.0.0/16"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.64.0.0/16"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.64.0.0/16"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.64.0.0/16"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.64.0.0/16"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.64.0.0/16"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.64.0.0/16"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.64.0.0/16"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P01_4.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P01_4.json new file mode 100644 index 00000000..088b298e --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P01_4.json @@ -0,0 +1,1013 @@ +{ + "test_id": "GRANT-P01_4", + "timestamp": "2026-02-23T00:43:46Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p01_4.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["100.108.74.26"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["100.108.74.26"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "100.108.74.26", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [{ "Net": "100.108.74.26/32", "Ports": { "First": 0, "Last": 65535 } }], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P01_5.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P01_5.json new file mode 100644 index 00000000..f0e73ac2 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P01_5.json @@ -0,0 +1,484 @@ +{ + "test_id": "GRANT-P01_5", + "timestamp": "2026-02-23T00:44:03Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p01_5.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["100.64.0.0/12"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["100.64.0.0/12"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P02_1.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P02_1.json new file mode 100644 index 00000000..4063382c --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P02_1.json @@ -0,0 +1,1107 @@ +{ + "test_id": "GRANT-P02_1", + "timestamp": "2026-02-23T00:44:20Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p02_1.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["kratail2tid@passkey"], + "dst": ["*"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["kratail2tid@passkey"], "dst": ["*"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P02_2.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P02_2.json new file mode 100644 index 00000000..8695baf3 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P02_2.json @@ -0,0 +1,1019 @@ +{ + "test_id": "GRANT-P02_2", + "timestamp": "2026-02-23T00:44:36Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p02_2.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["kratail2tid@passkey"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["kratail2tid@passkey"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.90.199.68", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.90.199.68/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P02_3.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P02_3.json new file mode 100644 index 00000000..6ae42c4f --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P02_3.json @@ -0,0 +1,1107 @@ +{ + "test_id": "GRANT-P02_3", + "timestamp": "2026-02-23T00:44:53Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p02_3.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["group:admins"], + "dst": ["*"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["group:admins"], "dst": ["*"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P02_4.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P02_4.json new file mode 100644 index 00000000..77f30882 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P02_4.json @@ -0,0 +1,1019 @@ +{ + "test_id": "GRANT-P02_4", + "timestamp": "2026-02-23T00:45:10Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p02_4.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["group:admins"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["group:admins"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.90.199.68", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.90.199.68/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P02_5_CORRECT.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P02_5_CORRECT.json new file mode 100644 index 00000000..e3754bf3 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P02_5_CORRECT.json @@ -0,0 +1,670 @@ +{ + "test_id": "GRANT-P02_5_CORRECT", + "timestamp": "2026-02-23T00:45:26Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p02_5_correct.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["22"] + }, + { + "src": ["tag:client"], + "dst": ["tag:prod"], + "ip": ["5432"] + } + ] + }, + "grants_section": [ + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["22"] }, + { "src": ["tag:client"], "dst": ["tag:prod"], "ip": ["5432"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.103.8.15", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 5432, "Last": 5432 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.103.8.15/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 5432, "Last": 5432 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P02_5_NAIVE.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P02_5_NAIVE.json new file mode 100644 index 00000000..0837e192 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P02_5_NAIVE.json @@ -0,0 +1,670 @@ +{ + "test_id": "GRANT-P02_5_NAIVE", + "timestamp": "2026-02-23T00:45:42Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p02_5_naive.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["tag:server", "tag:prod"], + "ip": ["22", "5432"] + } + ] + }, + "grants_section": [{ "src": ["tag:client"], "dst": ["tag:server", "tag:prod"], "ip": ["22", "5432"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.103.8.15", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.103.8.15", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 5432, "Last": 5432 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.103.8.15/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 5432, "Last": 5432 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 5432, "Last": 5432 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 5432, "Last": 5432 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P03_1.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P03_1.json new file mode 100644 index 00000000..61eefdbe --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P03_1.json @@ -0,0 +1,1107 @@ +{ + "test_id": "GRANT-P03_1", + "timestamp": "2026-02-23T00:45:58Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p03_1.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["*"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["tag:client"], "dst": ["*"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P03_2.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P03_2.json new file mode 100644 index 00000000..70fb1b43 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P03_2.json @@ -0,0 +1,1019 @@ +{ + "test_id": "GRANT-P03_2", + "timestamp": "2026-02-23T00:46:15Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p03_2.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["tag:server"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P03_3.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P03_3.json new file mode 100644 index 00000000..7a3a7825 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P03_3.json @@ -0,0 +1,573 @@ +{ + "test_id": "GRANT-P03_3", + "timestamp": "2026-02-23T00:46:32Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p03_3.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["tag:client"], "dst": ["tag:server"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P03_4.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P03_4.json new file mode 100644 index 00000000..0746bebe --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P03_4.json @@ -0,0 +1,648 @@ +{ + "test_id": "GRANT-P03_4", + "timestamp": "2026-02-23T00:46:49Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p03_4.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client", "tag:prod"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["tag:client", "tag:prod"], "dst": ["tag:server"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.103.8.15", "100.83.200.69", "fd7a:115c:a1e0::5b37:80f", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.83.200.69/32", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P04_1.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P04_1.json new file mode 100644 index 00000000..dfceb040 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P04_1.json @@ -0,0 +1,2015 @@ +{ + "test_id": "GRANT-P04_1", + "timestamp": "2026-02-23T00:47:06Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p04_1.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["*"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:member"], "dst": ["*"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P04_2.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P04_2.json new file mode 100644 index 00000000..18f34642 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P04_2.json @@ -0,0 +1,2562 @@ +{ + "test_id": "GRANT-P04_2", + "timestamp": "2026-02-23T00:47:22Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p04_2.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:tagged"], + "dst": ["*"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:tagged"], "dst": ["*"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P04_3.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P04_3.json new file mode 100644 index 00000000..8508e5b1 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P04_3.json @@ -0,0 +1,48 @@ +{ + "test_id": "GRANT-P04_3", + "description": "", + "timestamp": "2026-02-23T00:47:39Z", + "error": true, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p04_3.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["autogroup:self"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["autogroup:self"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "autogroup:self can only be used with users, groups, or supported autogroups" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P04_4.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P04_4.json new file mode 100644 index 00000000..585afb59 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P04_4.json @@ -0,0 +1,484 @@ +{ + "test_id": "GRANT-P04_4", + "timestamp": "2026-02-23T00:47:40Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p04_4.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["autogroup:internet"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["autogroup:internet"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P05_1.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P05_1.json new file mode 100644 index 00000000..b8822d03 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P05_1.json @@ -0,0 +1,1013 @@ +{ + "test_id": "GRANT-P05_1", + "timestamp": "2026-02-23T00:47:56Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p05_1.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["webserver"], + "ip": ["80"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["webserver"], "ip": ["80"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [{ "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P05_2.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P05_2.json new file mode 100644 index 00000000..8573f941 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P05_2.json @@ -0,0 +1,1083 @@ +{ + "test_id": "GRANT-P05_2", + "timestamp": "2026-02-23T00:48:13Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p05_2.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["webserver"], + "dst": ["*"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["webserver"], "dst": ["*"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.108.74.26"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.108.74.26/32"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.108.74.26"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.108.74.26/32"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.108.74.26"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.108.74.26/32"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.108.74.26"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.108.74.26/32"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.108.74.26"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.108.74.26/32"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.108.74.26"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.108.74.26/32"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.108.74.26"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.108.74.26/32"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["100.108.74.26"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.108.74.26/32"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P05_3.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P05_3.json new file mode 100644 index 00000000..7757a17d --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P05_3.json @@ -0,0 +1,1089 @@ +{ + "test_id": "GRANT-P05_3", + "timestamp": "2026-02-23T00:48:30Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p05_3.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["internal"], + "dst": ["*"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["internal"], "dst": ["*"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["10.0.0.0/8"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["10.0.0.0/8"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["10.0.0.0/8"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["10.0.0.0/8"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["10.0.0.0/8"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["10.0.0.0/8"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["10.0.0.0/8"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["10.0.0.0/8"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["10.0.0.0/8"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["10.0.0.0/8"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["10.0.0.0/8"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["10.0.0.0/8"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["10.0.0.0/8"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["10.0.0.0/8"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { "SrcIPs": ["10.0.0.0/8"], "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["10.0.0.0/8"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P06_1.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P06_1.json new file mode 100644 index 00000000..e3bf8b76 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P06_1.json @@ -0,0 +1,1020 @@ +{ + "test_id": "GRANT-P06_1", + "timestamp": "2026-02-23T00:48:47Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p06_1.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["tcp:22"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["tag:server"], "ip": ["tcp:22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ], + "IPProto": [6] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P06_2.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P06_2.json new file mode 100644 index 00000000..ed5ecc64 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P06_2.json @@ -0,0 +1,1020 @@ +{ + "test_id": "GRANT-P06_2", + "timestamp": "2026-02-23T00:49:03Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p06_2.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["udp:53"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["tag:server"], "ip": ["udp:53"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 53, "Last": 53 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 53, "Last": 53 } } + ], + "IPProto": [17] + } + ], + "packet_filter_matches": [ + { + "IPProto": [17], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 53, "Last": 53 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 53, "Last": 53 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P06_3.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P06_3.json new file mode 100644 index 00000000..67a0bbd8 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P06_3.json @@ -0,0 +1,1019 @@ +{ + "test_id": "GRANT-P06_3", + "timestamp": "2026-02-23T00:49:20Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p06_3.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["tag:server"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P06_4.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P06_4.json new file mode 100644 index 00000000..ed21e6f2 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P06_4.json @@ -0,0 +1,1019 @@ +{ + "test_id": "GRANT-P06_4", + "timestamp": "2026-02-23T00:49:37Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p06_4.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["tag:server"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P06_5.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P06_5.json new file mode 100644 index 00000000..fe95686c --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P06_5.json @@ -0,0 +1,1019 @@ +{ + "test_id": "GRANT-P06_5", + "timestamp": "2026-02-23T00:49:55Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p06_5.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["80-443"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["tag:server"], "ip": ["80-443"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 443 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 443 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P06_6.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P06_6.json new file mode 100644 index 00000000..718bf230 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P06_6.json @@ -0,0 +1,1027 @@ +{ + "test_id": "GRANT-P06_6", + "timestamp": "2026-02-23T00:50:11Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p06_6.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["22", "80", "443"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["tag:server"], "ip": ["22", "80", "443"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.108.74.26", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 443, "Last": 443 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P06_7.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P06_7.json new file mode 100644 index 00000000..e8155078 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P06_7.json @@ -0,0 +1,1019 @@ +{ + "test_id": "GRANT-P06_7", + "timestamp": "2026-02-23T00:50:27Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p06_7.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["tag:server"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_1.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_1.json new file mode 100644 index 00000000..a8de58f8 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_1.json @@ -0,0 +1,589 @@ +{ + "test_id": "GRANT-P08_1", + "timestamp": "2026-02-23T00:50:53Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p08_1.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["22"] + }, + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["80", "443"] + } + ] + }, + "grants_section": [ + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["22"] }, + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["80", "443"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.108.74.26", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 443, "Last": 443 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_2.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_2.json new file mode 100644 index 00000000..c0bd119a --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_2.json @@ -0,0 +1,1059 @@ +{ + "test_id": "GRANT-P08_2", + "timestamp": "2026-02-23T00:51:09Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p08_2.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["22"] + }, + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["80", "443"] + }, + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["udp:53"] + } + ] + }, + "grants_section": [ + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["22"] }, + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["80", "443"] }, + { "src": ["*"], "dst": ["tag:server"], "ip": ["udp:53"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.108.74.26", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 443, "Last": 443 } } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 53, "Last": 53 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 53, "Last": 53 } } + ], + "IPProto": [17] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + }, + { + "IPProto": [17], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 53, "Last": 53 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 53, "Last": 53 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_3.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_3.json new file mode 100644 index 00000000..1beed19c --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_3.json @@ -0,0 +1,484 @@ +{ + "test_id": "GRANT-P08_3", + "timestamp": "2026-02-23T00:51:25Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p08_3.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["group:empty"], + "dst": ["*"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["group:empty"], "dst": ["*"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_4.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_4.json new file mode 100644 index 00000000..9848f73d --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_4.json @@ -0,0 +1,595 @@ +{ + "test_id": "GRANT-P08_4", + "timestamp": "2026-02-23T00:51:42Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p08_4.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["22"] + }, + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["80"] + }, + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["443"] + } + ] + }, + "grants_section": [ + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["22"] }, + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["80"] }, + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["443"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.108.74.26", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 443, "Last": 443 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_5.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_5.json new file mode 100644 index 00000000..d543eece --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_5.json @@ -0,0 +1,761 @@ +{ + "test_id": "GRANT-P08_5", + "timestamp": "2026-02-23T00:51:58Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p08_5.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["22"] + }, + { + "src": ["tag:prod"], + "dst": ["tag:server"], + "ip": ["22"] + }, + { + "src": ["tag:router"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [ + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["22"] }, + { "src": ["tag:prod"], "dst": ["tag:server"], "ip": ["22"] }, + { "src": ["tag:router"], "dst": ["tag:server"], "ip": ["22"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + }, + { + "SrcIPs": ["100.103.8.15", "fd7a:115c:a1e0::5b37:80f"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + }, + { + "SrcIPs": ["100.92.142.61", "fd7a:115c:a1e0::3e37:8e3d"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_6.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_6.json new file mode 100644 index 00000000..e4242eee --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_6.json @@ -0,0 +1,1044 @@ +{ + "test_id": "GRANT-P08_6", + "timestamp": "2026-02-23T00:52:14Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p08_6.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["22"] + }, + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["80"] + } + ] + }, + "grants_section": [ + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["22"] }, + { "src": ["*"], "dst": ["tag:server"], "ip": ["80"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 80 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_7.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_7.json new file mode 100644 index 00000000..ff63617d --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_7.json @@ -0,0 +1,2800 @@ +{ + "test_id": "GRANT-P08_7", + "timestamp": "2026-02-23T00:52:30Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p08_7.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "ip": ["*"] + }, + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["*"], "ip": ["*"] }, + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["22"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + }, + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_8.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_8.json new file mode 100644 index 00000000..8a70522e --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P08_8.json @@ -0,0 +1,1019 @@ +{ + "test_id": "GRANT-P08_8", + "timestamp": "2026-02-23T00:52:47Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p08_8.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["10.0.0.0/8"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["10.0.0.0/8"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "10.0.0.0/8", "Ports": { "First": 22, "Last": 22 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [{ "Net": "10.0.0.0/8", "Ports": { "First": 22, "Last": 22 } }], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_10A.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_10A.json new file mode 100644 index 00000000..84a71af0 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_10A.json @@ -0,0 +1,828 @@ +{ + "test_id": "GRANT-P09_10A", + "timestamp": "2026-02-23T00:53:03Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_10a.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["tag:server"], + "ip": ["22"] + }, + { + "src": ["tag:client"], + "dst": ["group:admins"], + "ip": ["80"] + } + ] + }, + "grants_section": [ + { "src": ["autogroup:member"], "dst": ["tag:server"], "ip": ["22"] }, + { "src": ["tag:client"], "dst": ["group:admins"], "ip": ["80"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.90.199.68", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 80, "Last": 80 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.90.199.68/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_10B.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_10B.json new file mode 100644 index 00000000..a4b37cdc --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_10B.json @@ -0,0 +1,2827 @@ +{ + "test_id": "GRANT-P09_10B", + "timestamp": "2026-02-23T00:53:19Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_10b.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["group:admins"], + "dst": ["*"], + "ip": ["*"] + }, + { + "src": ["autogroup:tagged"], + "dst": ["*"], + "ip": ["*"] + } + ] + }, + "grants_section": [ + { "src": ["group:admins"], "dst": ["*"], "ip": ["*"] }, + { "src": ["autogroup:tagged"], "dst": ["*"], "ip": ["*"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + }, + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + }, + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + }, + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + }, + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + }, + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + }, + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + }, + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + }, + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_10C.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_10C.json new file mode 100644 index 00000000..02c08331 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_10C.json @@ -0,0 +1,1081 @@ +{ + "test_id": "GRANT-P09_10C", + "timestamp": "2026-02-23T00:53:35Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_10c.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["22"] + }, + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["80"] + }, + { + "src": ["autogroup:member"], + "dst": ["tag:server"], + "ip": ["443"] + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["tag:server"], "ip": ["22"] }, + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["80"] }, + { "src": ["autogroup:member"], "dst": ["tag:server"], "ip": ["443"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + }, + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 80 } } + ] + }, + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 443, "Last": 443 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_10D.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_10D.json new file mode 100644 index 00000000..f2c64b9f --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_10D.json @@ -0,0 +1,903 @@ +{ + "test_id": "GRANT-P09_10D", + "timestamp": "2026-02-23T00:53:52Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_10d.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client", "tag:prod"], + "dst": ["tag:server"], + "ip": ["22"] + }, + { + "src": ["autogroup:member", "group:admins"], + "dst": ["tag:router"], + "ip": ["5432"] + } + ] + }, + "grants_section": [ + { "src": ["tag:client", "tag:prod"], "dst": ["tag:server"], "ip": ["22"] }, + { "src": ["autogroup:member", "group:admins"], "dst": ["tag:router"], "ip": ["5432"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [ + { "IP": "100.92.142.61", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "fd7a:115c:a1e0::3e37:8e3d", "Ports": { "First": 5432, "Last": 5432 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.92.142.61/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "fd7a:115c:a1e0::3e37:8e3d/128", "Ports": { "First": 5432, "Last": 5432 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.103.8.15", "100.83.200.69", "fd7a:115c:a1e0::5b37:80f", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.83.200.69/32", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_11A.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_11A.json new file mode 100644 index 00000000..fd19d750 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_11A.json @@ -0,0 +1,813 @@ +{ + "test_id": "GRANT-P09_11A", + "timestamp": "2026-02-23T00:54:08Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_11a.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member", "tag:client"], + "dst": ["tag:server"], + "ip": ["22", "80", "443"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:member", "tag:client"], "dst": ["tag:server"], "ip": ["22", "80", "443"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.83.200.69", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.108.74.26", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 443, "Last": 443 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.83.200.69/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_11B.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_11B.json new file mode 100644 index 00000000..9ad8004c --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_11B.json @@ -0,0 +1,573 @@ +{ + "test_id": "GRANT-P09_11B", + "timestamp": "2026-02-23T00:54:24Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_11b.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["group:admins", "webserver"], + "dst": ["tag:server"], + "ip": ["80-443"] + } + ] + }, + "grants_section": [{ "src": ["group:admins", "webserver"], "dst": ["tag:server"], "ip": ["80-443"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.108.74.26", "100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 443 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.108.74.26/32", "100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 443 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_11C_NAIVE.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_11C_NAIVE.json new file mode 100644 index 00000000..7085806d --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_11C_NAIVE.json @@ -0,0 +1,838 @@ +{ + "test_id": "GRANT-P09_11C_NAIVE", + "timestamp": "2026-02-23T00:54:41Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_11c_naive.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client", "tag:prod"], + "dst": ["tag:server", "tag:router"], + "ip": ["22", "80-443", "5432", "3306"] + } + ] + }, + "grants_section": [ + { "src": ["tag:client", "tag:prod"], "dst": ["tag:server", "tag:router"], "ip": ["22", "80-443", "5432", "3306"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.103.8.15", "100.83.200.69", "fd7a:115c:a1e0::5b37:80f", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.92.142.61", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.92.142.61", "Ports": { "First": 80, "Last": 443 } }, + { "IP": "100.92.142.61", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "100.92.142.61", "Ports": { "First": 3306, "Last": 3306 } }, + { "IP": "fd7a:115c:a1e0::3e37:8e3d", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::3e37:8e3d", "Ports": { "First": 80, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::3e37:8e3d", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "fd7a:115c:a1e0::3e37:8e3d", "Ports": { "First": 3306, "Last": 3306 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.83.200.69/32", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.92.142.61/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.92.142.61/32", "Ports": { "First": 80, "Last": 443 } }, + { "Net": "100.92.142.61/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "100.92.142.61/32", "Ports": { "First": 3306, "Last": 3306 } }, + { "Net": "fd7a:115c:a1e0::3e37:8e3d/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::3e37:8e3d/128", "Ports": { "First": 80, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::3e37:8e3d/128", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "fd7a:115c:a1e0::3e37:8e3d/128", "Ports": { "First": 3306, "Last": 3306 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.103.8.15", "100.83.200.69", "fd7a:115c:a1e0::5b37:80f", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 443 } }, + { "IP": "100.108.74.26", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "100.108.74.26", "Ports": { "First": 3306, "Last": 3306 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 3306, "Last": 3306 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.83.200.69/32", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 443 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 3306, "Last": 3306 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 3306, "Last": 3306 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_11D.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_11D.json new file mode 100644 index 00000000..83f6e4f7 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_11D.json @@ -0,0 +1,1518 @@ +{ + "test_id": "GRANT-P09_11D", + "timestamp": "2026-02-23T00:54:57Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_11d.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:tagged", "autogroup:member"], + "dst": ["tag:server", "tag:router"], + "ip": ["*", "5432"] + } + ] + }, + "grants_section": [ + { "src": ["autogroup:tagged", "autogroup:member"], "dst": ["tag:server", "tag:router"], "ip": ["*", "5432"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.103.90.82", + "100.108.74.26", + "100.110.121.96", + "100.83.200.69", + "100.85.66.106", + "100.90.199.68", + "100.92.142.61", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::9e37:5a52", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [ + { "IP": "100.92.142.61", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "100.92.142.61", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "fd7a:115c:a1e0::3e37:8e3d", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::3e37:8e3d", "Ports": { "First": 5432, "Last": 5432 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.103.90.82/32", + "100.108.74.26/32", + "100.110.121.96/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.90.199.68/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::9e37:5a52/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.92.142.61/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "100.92.142.61/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "fd7a:115c:a1e0::3e37:8e3d/128", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::3e37:8e3d/128", "Ports": { "First": 5432, "Last": 5432 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.103.90.82", + "100.108.74.26", + "100.110.121.96", + "100.83.200.69", + "100.85.66.106", + "100.90.199.68", + "100.92.142.61", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::9e37:5a52", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "100.108.74.26", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 5432, "Last": 5432 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.103.90.82/32", + "100.108.74.26/32", + "100.110.121.96/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.90.199.68/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::9e37:5a52/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 5432, "Last": 5432 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 8, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_12A.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_12A.json new file mode 100644 index 00000000..496f5b99 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_12A.json @@ -0,0 +1,644 @@ +{ + "test_id": "GRANT-P09_12A", + "timestamp": "2026-02-23T00:55:13Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_12a.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["internal", "tag:client"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["internal", "tag:client"], "dst": ["tag:server"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["10.0.0.0/8", "100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["10.0.0.0/8", "100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_12B.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_12B.json new file mode 100644 index 00000000..cf683ed7 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_12B.json @@ -0,0 +1,667 @@ +{ + "test_id": "GRANT-P09_12B", + "timestamp": "2026-02-23T00:55:30Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_12b.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["internal", "tag:server"], + "ip": ["22", "80"] + } + ] + }, + "grants_section": [{ "src": ["tag:client"], "dst": ["internal", "tag:server"], "ip": ["22", "80"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "10.0.0.0/8", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "10.0.0.0/8", "Ports": { "First": 80, "Last": 80 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "10.0.0.0/8", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "10.0.0.0/8", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 80 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13A.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13A.json new file mode 100644 index 00000000..047b073e --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13A.json @@ -0,0 +1,48 @@ +{ + "test_id": "GRANT-P09_13A", + "description": "", + "timestamp": "2026-02-23T00:55:46Z", + "error": true, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_13a.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["autogroup:self"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["autogroup:self"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "autogroup:self can only be used with users, groups, or supported autogroups" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13B.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13B.json new file mode 100644 index 00000000..f215741a --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13B.json @@ -0,0 +1,48 @@ +{ + "test_id": "GRANT-P09_13B", + "description": "", + "timestamp": "2026-02-23T00:55:46Z", + "error": true, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_13b.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["autogroup:self"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["autogroup:self"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "autogroup:self can only be used with users, groups, or supported autogroups" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13C.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13C.json new file mode 100644 index 00000000..30c256ec --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13C.json @@ -0,0 +1,48 @@ +{ + "test_id": "GRANT-P09_13C", + "description": "", + "timestamp": "2026-02-23T00:55:46Z", + "error": true, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_13c.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["autogroup:self"], + "ip": ["22", "80", "443"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["autogroup:self"], "ip": ["22", "80", "443"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "autogroup:self can only be used with users, groups, or supported autogroups" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13D.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13D.json new file mode 100644 index 00000000..17115378 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13D.json @@ -0,0 +1,48 @@ +{ + "test_id": "GRANT-P09_13D", + "description": "", + "timestamp": "2026-02-23T00:55:46Z", + "error": true, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_13d.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["autogroup:self"], + "ip": ["80-443"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["autogroup:self"], "ip": ["80-443"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "autogroup:self can only be used with users, groups, or supported autogroups" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13E.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13E.json new file mode 100644 index 00000000..51836bae --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13E.json @@ -0,0 +1,541 @@ +{ + "test_id": "GRANT-P09_13E", + "timestamp": "2026-02-23T00:55:47Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_13e.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["autogroup:self"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:member"], "dst": ["autogroup:self"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.110.121.96", "fd7a:115c:a1e0::1737:7960"], + "DstPorts": [ + { "IP": "100.110.121.96", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::1737:7960", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.110.121.96/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::1737:7960/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.103.90.82", "fd7a:115c:a1e0::9e37:5a52"], + "DstPorts": [ + { "IP": "100.103.90.82", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::9e37:5a52", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.103.90.82/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::9e37:5a52/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [ + { "IP": "100.90.199.68", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.90.199.68/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13F.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13F.json new file mode 100644 index 00000000..b919e90c --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13F.json @@ -0,0 +1,503 @@ +{ + "test_id": "GRANT-P09_13F", + "timestamp": "2026-02-23T00:56:03Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_13f.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["kratail2tid@passkey"], + "dst": ["autogroup:self"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["kratail2tid@passkey"], "dst": ["autogroup:self"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [ + { "IP": "100.90.199.68", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.90.199.68/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13G.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13G.json new file mode 100644 index 00000000..9af14e3c --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13G.json @@ -0,0 +1,503 @@ +{ + "test_id": "GRANT-P09_13G", + "timestamp": "2026-02-23T00:56:19Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_13g.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["group:admins"], + "dst": ["autogroup:self"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["group:admins"], "dst": ["autogroup:self"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [ + { "IP": "100.90.199.68", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.90.199.68/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13H_CORRECT.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13H_CORRECT.json new file mode 100644 index 00000000..421964f1 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13H_CORRECT.json @@ -0,0 +1,56 @@ +{ + "test_id": "GRANT-P09_13H_CORRECT", + "description": "", + "timestamp": "2026-02-23T00:56:36Z", + "error": true, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_13h_correct.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["autogroup:self"], + "ip": ["*"] + }, + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["autogroup:self"], "ip": ["*"] }, + { "src": ["*"], "dst": ["tag:server"], "ip": ["22"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "autogroup:self can only be used with users, groups, or supported autogroups" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13H_NAIVE.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13H_NAIVE.json new file mode 100644 index 00000000..94cdafdd --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_13H_NAIVE.json @@ -0,0 +1,48 @@ +{ + "test_id": "GRANT-P09_13H_NAIVE", + "description": "", + "timestamp": "2026-02-23T00:56:36Z", + "error": true, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_13h_naive.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["autogroup:self", "tag:server"], + "ip": ["*", "22"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["autogroup:self", "tag:server"], "ip": ["*", "22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "autogroup:self can only be used with users, groups, or supported autogroups" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14A.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14A.json new file mode 100644 index 00000000..60c5d124 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14A.json @@ -0,0 +1,585 @@ +{ + "test_id": "GRANT-P09_14A", + "timestamp": "2026-02-23T00:56:36Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_14a.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["22"] + }, + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["80"] + } + ] + }, + "grants_section": [ + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["22"] }, + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["80"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 80 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14B.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14B.json new file mode 100644 index 00000000..d372981c --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14B.json @@ -0,0 +1,668 @@ +{ + "test_id": "GRANT-P09_14B", + "timestamp": "2026-02-23T00:56:52Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_14b.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["22"] + }, + { + "src": ["tag:prod"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [ + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["22"] }, + { "src": ["tag:prod"], "dst": ["tag:server"], "ip": ["22"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + }, + { + "SrcIPs": ["100.103.8.15", "fd7a:115c:a1e0::5b37:80f"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14C.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14C.json new file mode 100644 index 00000000..eefb18bc --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14C.json @@ -0,0 +1,2800 @@ +{ + "test_id": "GRANT-P09_14C", + "timestamp": "2026-02-23T00:57:09Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_14c.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "ip": ["*"] + }, + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["*"], "ip": ["*"] }, + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["22"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + }, + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14D.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14D.json new file mode 100644 index 00000000..2b41b140 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14D.json @@ -0,0 +1,761 @@ +{ + "test_id": "GRANT-P09_14D", + "timestamp": "2026-02-23T00:57:25Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_14d.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["22"] + }, + { + "src": ["tag:prod"], + "dst": ["tag:server"], + "ip": ["80"] + }, + { + "src": ["tag:router"], + "dst": ["tag:server"], + "ip": ["443"] + } + ] + }, + "grants_section": [ + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["22"] }, + { "src": ["tag:prod"], "dst": ["tag:server"], "ip": ["80"] }, + { "src": ["tag:router"], "dst": ["tag:server"], "ip": ["443"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + }, + { + "SrcIPs": ["100.103.8.15", "fd7a:115c:a1e0::5b37:80f"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 80 } } + ] + }, + { + "SrcIPs": ["100.92.142.61", "fd7a:115c:a1e0::3e37:8e3d"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 443, "Last": 443 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14E.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14E.json new file mode 100644 index 00000000..900f2644 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14E.json @@ -0,0 +1,765 @@ +{ + "test_id": "GRANT-P09_14E", + "timestamp": "2026-02-23T00:57:41Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_14e.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["22"] + }, + { + "src": ["tag:client"], + "dst": ["tag:prod"], + "ip": ["5432"] + }, + { + "src": ["tag:client"], + "dst": ["tag:router"], + "ip": ["80"] + } + ] + }, + "grants_section": [ + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["22"] }, + { "src": ["tag:client"], "dst": ["tag:prod"], "ip": ["5432"] }, + { "src": ["tag:client"], "dst": ["tag:router"], "ip": ["80"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.92.142.61", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::3e37:8e3d", "Ports": { "First": 80, "Last": 80 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.92.142.61/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::3e37:8e3d/128", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.103.8.15", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 5432, "Last": 5432 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.103.8.15/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 5432, "Last": 5432 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14F.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14F.json new file mode 100644 index 00000000..798f21c4 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14F.json @@ -0,0 +1,3015 @@ +{ + "test_id": "GRANT-P09_14F", + "timestamp": "2026-02-23T00:57:57Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_14f.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:tagged"], + "dst": ["*"], + "ip": ["*"] + }, + { + "src": ["autogroup:member"], + "dst": ["*"], + "ip": ["*"] + } + ] + }, + "grants_section": [ + { "src": ["autogroup:tagged"], "dst": ["*"], "ip": ["*"] }, + { "src": ["autogroup:member"], "dst": ["*"], "ip": ["*"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + }, + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + }, + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + }, + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + }, + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + }, + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + }, + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + }, + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + }, + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14G.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14G.json new file mode 100644 index 00000000..3550c540 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14G.json @@ -0,0 +1,758 @@ +{ + "test_id": "GRANT-P09_14G", + "timestamp": "2026-02-23T00:58:14Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_14g.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member", "group:admins", "kratail2tid@passkey"], + "dst": ["tag:server"], + "ip": ["22"] + }, + { + "src": ["tag:server", "webserver", "100.108.74.26"], + "dst": ["group:admins"], + "ip": ["80"] + } + ] + }, + "grants_section": [ + { "src": ["autogroup:member", "group:admins", "kratail2tid@passkey"], "dst": ["tag:server"], "ip": ["22"] }, + { "src": ["tag:server", "webserver", "100.108.74.26"], "dst": ["group:admins"], "ip": ["80"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.108.74.26", "fd7a:115c:a1e0::b901:4a87"], + "DstPorts": [ + { "IP": "100.90.199.68", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 80, "Last": 80 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.90.199.68/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14H.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14H.json new file mode 100644 index 00000000..2d4154b1 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14H.json @@ -0,0 +1,1121 @@ +{ + "test_id": "GRANT-P09_14H", + "timestamp": "2026-02-23T00:58:30Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_14h.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["*"], + "ip": ["*"] + }, + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [ + { "src": ["tag:client"], "dst": ["*"], "ip": ["*"] }, + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["22"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "*", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14I.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14I.json new file mode 100644 index 00000000..7560fa29 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_14I.json @@ -0,0 +1,2801 @@ +{ + "test_id": "GRANT-P09_14I", + "timestamp": "2026-02-23T00:58:46Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_14i.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server"], + "ip": ["22"] + }, + { + "src": ["*"], + "dst": ["tag:prod"], + "ip": ["5432"] + }, + { + "src": ["*"], + "dst": ["*"], + "ip": ["80"] + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["tag:server"], "ip": ["22"] }, + { "src": ["*"], "dst": ["tag:prod"], "ip": ["5432"] }, + { "src": ["*"], "dst": ["*"], "ip": ["80"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 80, "Last": 80 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "::/0", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 80, "Last": 80 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "::/0", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 80, "Last": 80 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "::/0", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.103.8.15", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "*", "Ports": { "First": 80, "Last": 80 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.103.8.15/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "0.0.0.0/0", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "::/0", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "*", "Ports": { "First": 80, "Last": 80 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "0.0.0.0/0", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "::/0", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 80, "Last": 80 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "::/0", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 80, "Last": 80 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "::/0", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 80, "Last": 80 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "::/0", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_1A.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_1A.json new file mode 100644 index 00000000..45014008 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_1A.json @@ -0,0 +1,805 @@ +{ + "test_id": "GRANT-P09_1A", + "timestamp": "2026-02-23T00:59:02Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_1a.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member", "tag:client"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:member", "tag:client"], "dst": ["tag:server"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.83.200.69", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.83.200.69/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_1B.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_1B.json new file mode 100644 index 00000000..9c05bffc --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_1B.json @@ -0,0 +1,1031 @@ +{ + "test_id": "GRANT-P09_1B", + "timestamp": "2026-02-23T00:59:19Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_1b.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:tagged", "autogroup:member"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:tagged", "autogroup:member"], "dst": ["tag:server"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.103.90.82", + "100.108.74.26", + "100.110.121.96", + "100.83.200.69", + "100.85.66.106", + "100.90.199.68", + "100.92.142.61", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::9e37:5a52", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.103.90.82/32", + "100.108.74.26/32", + "100.110.121.96/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.90.199.68/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::9e37:5a52/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_1C.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_1C.json new file mode 100644 index 00000000..ba657c21 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_1C.json @@ -0,0 +1,648 @@ +{ + "test_id": "GRANT-P09_1C", + "timestamp": "2026-02-23T00:59:35Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_1c.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["group:admins", "tag:client"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["group:admins", "tag:client"], "dst": ["tag:server"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "100.90.199.68", "fd7a:115c:a1e0::2d01:c747", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.83.200.69/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_1D.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_1D.json new file mode 100644 index 00000000..523d66e0 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_1D.json @@ -0,0 +1,648 @@ +{ + "test_id": "GRANT-P09_1D", + "timestamp": "2026-02-23T00:59:51Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_1d.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["kratail2tid@passkey", "tag:client"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["kratail2tid@passkey", "tag:client"], "dst": ["tag:server"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "100.90.199.68", "fd7a:115c:a1e0::2d01:c747", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.83.200.69/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_1E.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_1E.json new file mode 100644 index 00000000..44d6125a --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_1E.json @@ -0,0 +1,643 @@ +{ + "test_id": "GRANT-P09_1E", + "timestamp": "2026-02-23T01:00:07Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_1e.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["100.90.199.68", "tag:client"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["100.90.199.68", "tag:client"], "dst": ["tag:server"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "100.90.199.68", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "100.90.199.68/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_2A_CORRECT.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_2A_CORRECT.json new file mode 100644 index 00000000..aadffe4b --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_2A_CORRECT.json @@ -0,0 +1,670 @@ +{ + "test_id": "GRANT-P09_2A_CORRECT", + "timestamp": "2026-02-23T01:00:24Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_2a_correct.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["22"] + }, + { + "src": ["tag:client"], + "dst": ["tag:prod"], + "ip": ["5432"] + } + ] + }, + "grants_section": [ + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["22"] }, + { "src": ["tag:client"], "dst": ["tag:prod"], "ip": ["5432"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.103.8.15", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 5432, "Last": 5432 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.103.8.15/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 5432, "Last": 5432 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_2A_NAIVE.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_2A_NAIVE.json new file mode 100644 index 00000000..7f71c466 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_2A_NAIVE.json @@ -0,0 +1,670 @@ +{ + "test_id": "GRANT-P09_2A_NAIVE", + "timestamp": "2026-02-23T01:00:40Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_2a_naive.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["tag:server", "tag:prod"], + "ip": ["22", "5432"] + } + ] + }, + "grants_section": [{ "src": ["tag:client"], "dst": ["tag:server", "tag:prod"], "ip": ["22", "5432"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.103.8.15", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.103.8.15", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 5432, "Last": 5432 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.103.8.15/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 5432, "Last": 5432 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 5432, "Last": 5432 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 5432, "Last": 5432 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_2B_CORRECT.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_2B_CORRECT.json new file mode 100644 index 00000000..688b02fe --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_2B_CORRECT.json @@ -0,0 +1,583 @@ +{ + "test_id": "GRANT-P09_2B_CORRECT", + "timestamp": "2026-02-23T01:00:56Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_2b_correct.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["tag:server"], + "ip": ["22"] + }, + { + "src": ["tag:client"], + "dst": ["webserver"], + "ip": ["80"] + } + ] + }, + "grants_section": [ + { "src": ["tag:client"], "dst": ["tag:server"], "ip": ["22"] }, + { "src": ["tag:client"], "dst": ["webserver"], "ip": ["80"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_2B_NAIVE.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_2B_NAIVE.json new file mode 100644 index 00000000..6c565dce --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_2B_NAIVE.json @@ -0,0 +1,581 @@ +{ + "test_id": "GRANT-P09_2B_NAIVE", + "timestamp": "2026-02-23T01:01:12Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_2b_naive.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["tag:server", "webserver"], + "ip": ["22", "80"] + } + ] + }, + "grants_section": [{ "src": ["tag:client"], "dst": ["tag:server", "webserver"], "ip": ["22", "80"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_2C.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_2C.json new file mode 100644 index 00000000..0035b078 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_2C.json @@ -0,0 +1,662 @@ +{ + "test_id": "GRANT-P09_2C", + "timestamp": "2026-02-23T01:01:29Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_2c.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["webserver", "prodbox"], + "ip": ["22", "5432"] + } + ] + }, + "grants_section": [{ "src": ["tag:client"], "dst": ["webserver", "prodbox"], "ip": ["22", "5432"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.103.8.15", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.103.8.15", "Ports": { "First": 5432, "Last": 5432 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.103.8.15/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 5432, "Last": 5432 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 5432, "Last": 5432 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 5432, "Last": 5432 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_3A.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_3A.json new file mode 100644 index 00000000..5486d107 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_3A.json @@ -0,0 +1,573 @@ +{ + "test_id": "GRANT-P09_3A", + "timestamp": "2026-02-23T01:01:45Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_3a.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:server", "webserver"], + "dst": ["tag:client"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["tag:server", "webserver"], "dst": ["tag:client"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.108.74.26", "fd7a:115c:a1e0::b901:4a87"], + "DstPorts": [ + { "IP": "100.83.200.69", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::c537:c845", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.83.200.69/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::c537:c845/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_3B.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_3B.json new file mode 100644 index 00000000..236c21c8 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_3B.json @@ -0,0 +1,733 @@ +{ + "test_id": "GRANT-P09_3B", + "timestamp": "2026-02-23T01:02:02Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_3b.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member", "kratail2tid@passkey", "group:admins"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [ + { "src": ["autogroup:member", "kratail2tid@passkey", "group:admins"], "dst": ["tag:server"], "ip": ["22"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_3C.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_3C.json new file mode 100644 index 00000000..0aedd135 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_3C.json @@ -0,0 +1,575 @@ +{ + "test_id": "GRANT-P09_3C", + "timestamp": "2026-02-23T01:02:18Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_3c.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["tag:server", "webserver"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["tag:client"], "dst": ["tag:server", "webserver"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_4A.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_4A.json new file mode 100644 index 00000000..d25f2c62 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_4A.json @@ -0,0 +1,731 @@ +{ + "test_id": "GRANT-P09_4A", + "timestamp": "2026-02-23T01:02:35Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_4a.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:member"], "dst": ["tag:server"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_4B.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_4B.json new file mode 100644 index 00000000..cc4c34c9 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_4B.json @@ -0,0 +1,875 @@ +{ + "test_id": "GRANT-P09_4B", + "timestamp": "2026-02-23T01:02:52Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_4b.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:tagged"], + "dst": ["kratail2tid@passkey"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:tagged"], "dst": ["kratail2tid@passkey"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.85.66.106", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [ + { "IP": "100.90.199.68", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.90.199.68/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_4C.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_4C.json new file mode 100644 index 00000000..a230baee --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_4C.json @@ -0,0 +1,567 @@ +{ + "test_id": "GRANT-P09_4C", + "timestamp": "2026-02-23T01:03:09Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_4c.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["group:admins"], + "dst": ["webserver"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["group:admins"], "dst": ["webserver"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [{ "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [{ "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_4D.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_4D.json new file mode 100644 index 00000000..3a0b2586 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_4D.json @@ -0,0 +1,573 @@ +{ + "test_id": "GRANT-P09_4D", + "timestamp": "2026-02-23T01:03:26Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_4d.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["webserver"], + "dst": ["group:admins"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["webserver"], "dst": ["group:admins"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.108.74.26"], + "DstPorts": [ + { "IP": "100.90.199.68", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.108.74.26/32"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.90.199.68/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_4E.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_4E.json new file mode 100644 index 00000000..96984e95 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_4E.json @@ -0,0 +1,541 @@ +{ + "test_id": "GRANT-P09_4E", + "timestamp": "2026-02-23T01:03:42Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_4e.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["autogroup:self"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:member"], "dst": ["autogroup:self"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.110.121.96", "fd7a:115c:a1e0::1737:7960"], + "DstPorts": [ + { "IP": "100.110.121.96", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::1737:7960", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.110.121.96/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::1737:7960/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.103.90.82", "fd7a:115c:a1e0::9e37:5a52"], + "DstPorts": [ + { "IP": "100.103.90.82", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::9e37:5a52", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.103.90.82/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::9e37:5a52/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [ + { "IP": "100.90.199.68", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.90.199.68/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_4F.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_4F.json new file mode 100644 index 00000000..1c3f4f46 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_4F.json @@ -0,0 +1,573 @@ +{ + "test_id": "GRANT-P09_4F", + "timestamp": "2026-02-23T01:03:58Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_4f.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["100.90.199.68"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["100.90.199.68"], "dst": ["tag:server"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_4G.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_4G.json new file mode 100644 index 00000000..24c6cc74 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_4G.json @@ -0,0 +1,567 @@ +{ + "test_id": "GRANT-P09_4G", + "timestamp": "2026-02-23T01:04:15Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_4g.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["100.108.74.26"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["tag:client"], "dst": ["100.108.74.26"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [{ "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [{ "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_5A.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_5A.json new file mode 100644 index 00000000..eaf9ae24 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_5A.json @@ -0,0 +1,648 @@ +{ + "test_id": "GRANT-P09_5A", + "timestamp": "2026-02-23T01:04:32Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_5a.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client", "tag:prod"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["tag:client", "tag:prod"], "dst": ["tag:server"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.103.8.15", "100.83.200.69", "fd7a:115c:a1e0::5b37:80f", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.83.200.69/32", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_5B.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_5B.json new file mode 100644 index 00000000..198db612 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_5B.json @@ -0,0 +1,648 @@ +{ + "test_id": "GRANT-P09_5B", + "timestamp": "2026-02-23T01:04:49Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_5b.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:prod", "tag:client"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["tag:prod", "tag:client"], "dst": ["tag:server"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.103.8.15", "100.83.200.69", "fd7a:115c:a1e0::5b37:80f", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.83.200.69/32", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_5C_NAIVE.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_5C_NAIVE.json new file mode 100644 index 00000000..5a3f357d --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_5C_NAIVE.json @@ -0,0 +1,670 @@ +{ + "test_id": "GRANT-P09_5C_NAIVE", + "timestamp": "2026-02-23T01:05:06Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_5c_naive.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["tag:server", "tag:prod"], + "ip": ["22", "80"] + } + ] + }, + "grants_section": [{ "src": ["tag:client"], "dst": ["tag:server", "tag:prod"], "ip": ["22", "80"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.103.8.15", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.103.8.15", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 80, "Last": 80 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.103.8.15/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 80 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_6A.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_6A.json new file mode 100644 index 00000000..72936b58 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_6A.json @@ -0,0 +1,1484 @@ +{ + "test_id": "GRANT-P09_6A", + "timestamp": "2026-02-23T01:05:22Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_6a.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["webserver", "prodbox"], + "ip": ["22", "5432"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["webserver", "prodbox"], "ip": ["22", "5432"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.103.8.15", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.103.8.15", "Ports": { "First": 5432, "Last": 5432 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.103.8.15/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 5432, "Last": 5432 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 5432, "Last": 5432 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 5432, "Last": 5432 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_6B.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_6B.json new file mode 100644 index 00000000..ca684d3d --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_6B.json @@ -0,0 +1,484 @@ +{ + "test_id": "GRANT-P09_6B", + "timestamp": "2026-02-23T01:05:39Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_6b.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["group:empty"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["group:empty"], "dst": ["tag:server"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_6C.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_6C.json new file mode 100644 index 00000000..4784e40a --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_6C.json @@ -0,0 +1,574 @@ +{ + "test_id": "GRANT-P09_6C", + "timestamp": "2026-02-23T01:05:56Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_6c.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["internal"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["internal"], "dst": ["tag:server"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["10.0.0.0/8"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["10.0.0.0/8"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_6D.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_6D.json new file mode 100644 index 00000000..95ed4d02 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_6D.json @@ -0,0 +1,568 @@ +{ + "test_id": "GRANT-P09_6D", + "timestamp": "2026-02-23T01:06:13Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_6d.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["internal"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["tag:client"], "dst": ["internal"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [{ "IP": "10.0.0.0/8", "Ports": { "First": 22, "Last": 22 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [{ "Net": "10.0.0.0/8", "Ports": { "First": 22, "Last": 22 } }], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_7A.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_7A.json new file mode 100644 index 00000000..2dfe44a0 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_7A.json @@ -0,0 +1,1073 @@ +{ + "test_id": "GRANT-P09_7A", + "timestamp": "2026-02-23T01:06:30Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_7a.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": [ + "*", + "autogroup:member", + "autogroup:tagged", + "group:admins", + "tag:client", + "webserver", + "100.90.199.68" + ], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [ + { + "src": [ + "*", + "autogroup:member", + "autogroup:tagged", + "group:admins", + "tag:client", + "webserver", + "100.90.199.68" + ], + "dst": ["tag:server"], + "ip": ["22"] + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.103.8.15", + "100.103.90.82", + "100.108.74.26", + "100.110.121.96", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "100.83.200.69", + "100.85.66.106", + "100.90.199.68", + "100.92.142.61", + "fd7a:115c:a1e0::/48", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::9e37:5a52", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.103.8.15/32", + "100.103.90.82/32", + "100.108.74.26/32", + "100.110.121.96/32", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "100.83.200.69/32", + "100.85.66.106/32", + "100.90.199.68/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::/48", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::9e37:5a52/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_7B_NAIVE.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_7B_NAIVE.json new file mode 100644 index 00000000..d92c607e --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_7B_NAIVE.json @@ -0,0 +1,915 @@ +{ + "test_id": "GRANT-P09_7B_NAIVE", + "timestamp": "2026-02-23T01:06:47Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_7b_naive.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": [ + "tag:server", + "tag:prod", + "webserver", + "prodbox", + "group:admins", + "kratail2tid@passkey", + "100.108.74.26" + ], + "ip": ["22", "5432", "80", "443", "8080", "3000", "9000"] + } + ] + }, + "grants_section": [ + { + "src": ["tag:client"], + "dst": [ + "tag:server", + "tag:prod", + "webserver", + "prodbox", + "group:admins", + "kratail2tid@passkey", + "100.108.74.26" + ], + "ip": ["22", "5432", "80", "443", "8080", "3000", "9000"] + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.103.8.15", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.103.8.15", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "100.103.8.15", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.103.8.15", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "100.103.8.15", "Ports": { "First": 8080, "Last": 8080 } }, + { "IP": "100.103.8.15", "Ports": { "First": 3000, "Last": 3000 } }, + { "IP": "100.103.8.15", "Ports": { "First": 9000, "Last": 9000 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 8080, "Last": 8080 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 3000, "Last": 3000 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 9000, "Last": 9000 } }, + { "IP": "100.103.8.15", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.103.8.15", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "100.103.8.15", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.103.8.15", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "100.103.8.15", "Ports": { "First": 8080, "Last": 8080 } }, + { "IP": "100.103.8.15", "Ports": { "First": 3000, "Last": 3000 } }, + { "IP": "100.103.8.15", "Ports": { "First": 9000, "Last": 9000 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.103.8.15/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 8080, "Last": 8080 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 3000, "Last": 3000 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 9000, "Last": 9000 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 8080, "Last": 8080 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 3000, "Last": 3000 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 9000, "Last": 9000 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 8080, "Last": 8080 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 3000, "Last": 3000 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 9000, "Last": 9000 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.108.74.26", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "100.108.74.26", "Ports": { "First": 8080, "Last": 8080 } }, + { "IP": "100.108.74.26", "Ports": { "First": 3000, "Last": 3000 } }, + { "IP": "100.108.74.26", "Ports": { "First": 9000, "Last": 9000 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 8080, "Last": 8080 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 3000, "Last": 3000 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 9000, "Last": 9000 } }, + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.108.74.26", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "100.108.74.26", "Ports": { "First": 8080, "Last": 8080 } }, + { "IP": "100.108.74.26", "Ports": { "First": 3000, "Last": 3000 } }, + { "IP": "100.108.74.26", "Ports": { "First": 9000, "Last": 9000 } }, + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.108.74.26", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "100.108.74.26", "Ports": { "First": 8080, "Last": 8080 } }, + { "IP": "100.108.74.26", "Ports": { "First": 3000, "Last": 3000 } }, + { "IP": "100.108.74.26", "Ports": { "First": 9000, "Last": 9000 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 8080, "Last": 8080 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 3000, "Last": 3000 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 9000, "Last": 9000 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 8080, "Last": 8080 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 3000, "Last": 3000 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 9000, "Last": 9000 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 8080, "Last": 8080 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 3000, "Last": 3000 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 9000, "Last": 9000 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 8080, "Last": 8080 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 3000, "Last": 3000 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 9000, "Last": 9000 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.90.199.68", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.90.199.68", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "100.90.199.68", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.90.199.68", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "100.90.199.68", "Ports": { "First": 8080, "Last": 8080 } }, + { "IP": "100.90.199.68", "Ports": { "First": 3000, "Last": 3000 } }, + { "IP": "100.90.199.68", "Ports": { "First": 9000, "Last": 9000 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 8080, "Last": 8080 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 3000, "Last": 3000 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 9000, "Last": 9000 } }, + { "IP": "100.90.199.68", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.90.199.68", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "100.90.199.68", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.90.199.68", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "100.90.199.68", "Ports": { "First": 8080, "Last": 8080 } }, + { "IP": "100.90.199.68", "Ports": { "First": 3000, "Last": 3000 } }, + { "IP": "100.90.199.68", "Ports": { "First": 9000, "Last": 9000 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 8080, "Last": 8080 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 3000, "Last": 3000 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 9000, "Last": 9000 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.90.199.68/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.90.199.68/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "100.90.199.68/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.90.199.68/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "100.90.199.68/32", "Ports": { "First": 8080, "Last": 8080 } }, + { "Net": "100.90.199.68/32", "Ports": { "First": 3000, "Last": 3000 } }, + { "Net": "100.90.199.68/32", "Ports": { "First": 9000, "Last": 9000 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 8080, "Last": 8080 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 3000, "Last": 3000 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 9000, "Last": 9000 } }, + { "Net": "100.90.199.68/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.90.199.68/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "100.90.199.68/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.90.199.68/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "100.90.199.68/32", "Ports": { "First": 8080, "Last": 8080 } }, + { "Net": "100.90.199.68/32", "Ports": { "First": 3000, "Last": 3000 } }, + { "Net": "100.90.199.68/32", "Ports": { "First": 9000, "Last": 9000 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 8080, "Last": 8080 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 3000, "Last": 3000 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 9000, "Last": 9000 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_7C.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_7C.json new file mode 100644 index 00000000..ec8886b6 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_7C.json @@ -0,0 +1,2907 @@ +{ + "test_id": "GRANT-P09_7C", + "timestamp": "2026-02-23T01:07:03Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_7c.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": [ + "autogroup:member", + "autogroup:tagged", + "group:admins", + "group:developers", + "kratail2tid@passkey", + "tag:client", + "tag:prod", + "tag:router", + "webserver", + "prodbox" + ], + "dst": ["*"], + "ip": ["*"] + } + ] + }, + "grants_section": [ + { + "src": [ + "autogroup:member", + "autogroup:tagged", + "group:admins", + "group:developers", + "kratail2tid@passkey", + "tag:client", + "tag:prod", + "tag:router", + "webserver", + "prodbox" + ], + "dst": ["*"], + "ip": ["*"] + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.103.90.82", + "100.108.74.26", + "100.110.121.96", + "100.83.200.69", + "100.85.66.106", + "100.90.199.68", + "100.92.142.61", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::9e37:5a52", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.103.90.82/32", + "100.108.74.26/32", + "100.110.121.96/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.90.199.68/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::9e37:5a52/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.103.90.82", + "100.108.74.26", + "100.110.121.96", + "100.83.200.69", + "100.85.66.106", + "100.90.199.68", + "100.92.142.61", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::9e37:5a52", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.103.90.82/32", + "100.108.74.26/32", + "100.110.121.96/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.90.199.68/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::9e37:5a52/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.103.90.82", + "100.108.74.26", + "100.110.121.96", + "100.83.200.69", + "100.85.66.106", + "100.90.199.68", + "100.92.142.61", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::9e37:5a52", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.103.90.82/32", + "100.108.74.26/32", + "100.110.121.96/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.90.199.68/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::9e37:5a52/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.103.90.82", + "100.108.74.26", + "100.110.121.96", + "100.83.200.69", + "100.85.66.106", + "100.90.199.68", + "100.92.142.61", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::9e37:5a52", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.103.90.82/32", + "100.108.74.26/32", + "100.110.121.96/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.90.199.68/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::9e37:5a52/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.103.90.82", + "100.108.74.26", + "100.110.121.96", + "100.83.200.69", + "100.85.66.106", + "100.90.199.68", + "100.92.142.61", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::9e37:5a52", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.103.90.82/32", + "100.108.74.26/32", + "100.110.121.96/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.90.199.68/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::9e37:5a52/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.103.90.82", + "100.108.74.26", + "100.110.121.96", + "100.83.200.69", + "100.85.66.106", + "100.90.199.68", + "100.92.142.61", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::9e37:5a52", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.103.90.82/32", + "100.108.74.26/32", + "100.110.121.96/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.90.199.68/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::9e37:5a52/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.103.90.82", + "100.108.74.26", + "100.110.121.96", + "100.83.200.69", + "100.85.66.106", + "100.90.199.68", + "100.92.142.61", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::9e37:5a52", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.103.90.82/32", + "100.108.74.26/32", + "100.110.121.96/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.90.199.68/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::9e37:5a52/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.103.90.82", + "100.108.74.26", + "100.110.121.96", + "100.83.200.69", + "100.85.66.106", + "100.90.199.68", + "100.92.142.61", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::9e37:5a52", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.103.90.82/32", + "100.108.74.26/32", + "100.110.121.96/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.90.199.68/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::9e37:5a52/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_7D_NAIVE.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_7D_NAIVE.json new file mode 100644 index 00000000..47dc94cf --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_7D_NAIVE.json @@ -0,0 +1,2313 @@ +{ + "test_id": "GRANT-P09_7D_NAIVE", + "timestamp": "2026-02-23T01:07:20Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_7d_naive.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server", "tag:prod", "tag:client", "tag:router", "webserver", "prodbox"], + "ip": ["22", "80", "443", "5432", "3306", "8080"] + } + ] + }, + "grants_section": [ + { + "src": ["*"], + "dst": ["tag:server", "tag:prod", "tag:client", "tag:router", "webserver", "prodbox"], + "ip": ["22", "80", "443", "5432", "3306", "8080"] + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.92.142.61", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.92.142.61", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.92.142.61", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "100.92.142.61", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "100.92.142.61", "Ports": { "First": 3306, "Last": 3306 } }, + { "IP": "100.92.142.61", "Ports": { "First": 8080, "Last": 8080 } }, + { "IP": "fd7a:115c:a1e0::3e37:8e3d", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::3e37:8e3d", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::3e37:8e3d", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::3e37:8e3d", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "fd7a:115c:a1e0::3e37:8e3d", "Ports": { "First": 3306, "Last": 3306 } }, + { "IP": "fd7a:115c:a1e0::3e37:8e3d", "Ports": { "First": 8080, "Last": 8080 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.92.142.61/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.92.142.61/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.92.142.61/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "100.92.142.61/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "100.92.142.61/32", "Ports": { "First": 3306, "Last": 3306 } }, + { "Net": "100.92.142.61/32", "Ports": { "First": 8080, "Last": 8080 } }, + { "Net": "fd7a:115c:a1e0::3e37:8e3d/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::3e37:8e3d/128", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::3e37:8e3d/128", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::3e37:8e3d/128", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "fd7a:115c:a1e0::3e37:8e3d/128", "Ports": { "First": 3306, "Last": 3306 } }, + { "Net": "fd7a:115c:a1e0::3e37:8e3d/128", "Ports": { "First": 8080, "Last": 8080 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.83.200.69", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.83.200.69", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.83.200.69", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "100.83.200.69", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "100.83.200.69", "Ports": { "First": 3306, "Last": 3306 } }, + { "IP": "100.83.200.69", "Ports": { "First": 8080, "Last": 8080 } }, + { "IP": "fd7a:115c:a1e0::c537:c845", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::c537:c845", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::c537:c845", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::c537:c845", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "fd7a:115c:a1e0::c537:c845", "Ports": { "First": 3306, "Last": 3306 } }, + { "IP": "fd7a:115c:a1e0::c537:c845", "Ports": { "First": 8080, "Last": 8080 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.83.200.69/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.83.200.69/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.83.200.69/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "100.83.200.69/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "100.83.200.69/32", "Ports": { "First": 3306, "Last": 3306 } }, + { "Net": "100.83.200.69/32", "Ports": { "First": 8080, "Last": 8080 } }, + { "Net": "fd7a:115c:a1e0::c537:c845/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::c537:c845/128", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::c537:c845/128", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::c537:c845/128", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "fd7a:115c:a1e0::c537:c845/128", "Ports": { "First": 3306, "Last": 3306 } }, + { "Net": "fd7a:115c:a1e0::c537:c845/128", "Ports": { "First": 8080, "Last": 8080 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.103.8.15", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.103.8.15", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.103.8.15", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "100.103.8.15", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "100.103.8.15", "Ports": { "First": 3306, "Last": 3306 } }, + { "IP": "100.103.8.15", "Ports": { "First": 8080, "Last": 8080 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 3306, "Last": 3306 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 8080, "Last": 8080 } }, + { "IP": "100.103.8.15", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.103.8.15", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.103.8.15", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "100.103.8.15", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "100.103.8.15", "Ports": { "First": 3306, "Last": 3306 } }, + { "IP": "100.103.8.15", "Ports": { "First": 8080, "Last": 8080 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.103.8.15/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 3306, "Last": 3306 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 8080, "Last": 8080 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 3306, "Last": 3306 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 8080, "Last": 8080 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 3306, "Last": 3306 } }, + { "Net": "100.103.8.15/32", "Ports": { "First": 8080, "Last": 8080 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.108.74.26", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "100.108.74.26", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "100.108.74.26", "Ports": { "First": 3306, "Last": 3306 } }, + { "IP": "100.108.74.26", "Ports": { "First": 8080, "Last": 8080 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 3306, "Last": 3306 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 8080, "Last": 8080 } }, + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "100.108.74.26", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "100.108.74.26", "Ports": { "First": 5432, "Last": 5432 } }, + { "IP": "100.108.74.26", "Ports": { "First": 3306, "Last": 3306 } }, + { "IP": "100.108.74.26", "Ports": { "First": 8080, "Last": 8080 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 3306, "Last": 3306 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 8080, "Last": 8080 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 3306, "Last": 3306 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 8080, "Last": 8080 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 5432, "Last": 5432 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 3306, "Last": 3306 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 8080, "Last": 8080 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_8A.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_8A.json new file mode 100644 index 00000000..0b5754de --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_8A.json @@ -0,0 +1,737 @@ +{ + "test_id": "GRANT-P09_8A", + "timestamp": "2026-02-23T01:07:38Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_8a.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member", "group:admins", "group:developers", "kratail2tid@passkey", "100.90.199.68"], + "dst": ["tag:server"], + "ip": ["22"] + } + ] + }, + "grants_section": [ + { + "src": ["autogroup:member", "group:admins", "group:developers", "kratail2tid@passkey", "100.90.199.68"], + "dst": ["tag:server"], + "ip": ["22"] + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_8B.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_8B.json new file mode 100644 index 00000000..d1aee8b8 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_8B.json @@ -0,0 +1,573 @@ +{ + "test_id": "GRANT-P09_8B", + "timestamp": "2026-02-23T01:07:54Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_8b.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:server", "webserver", "100.108.74.26"], + "dst": ["tag:client"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["tag:server", "webserver", "100.108.74.26"], "dst": ["tag:client"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.108.74.26", "fd7a:115c:a1e0::b901:4a87"], + "DstPorts": [ + { "IP": "100.83.200.69", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::c537:c845", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.83.200.69/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::c537:c845/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_8C.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_8C.json new file mode 100644 index 00000000..3d9c218a --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_8C.json @@ -0,0 +1,577 @@ +{ + "test_id": "GRANT-P09_8C", + "timestamp": "2026-02-23T01:08:11Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_8c.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["tag:server", "webserver", "100.108.74.26"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["tag:client"], "dst": ["tag:server", "webserver", "100.108.74.26"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_9A.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_9A.json new file mode 100644 index 00000000..da45f50e --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_9A.json @@ -0,0 +1,2315 @@ +{ + "test_id": "GRANT-P09_9A", + "timestamp": "2026-02-23T01:08:28Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_9a.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:server", "tag:client", "tag:prod", "tag:router"], + "dst": ["*"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["tag:server", "tag:client", "tag:prod", "tag:router"], "dst": ["*"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.108.74.26", + "100.83.200.69", + "100.92.142.61", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.108.74.26/32", + "100.83.200.69/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_9B.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_9B.json new file mode 100644 index 00000000..fda0df77 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_9B.json @@ -0,0 +1,2203 @@ +{ + "test_id": "GRANT-P09_9B", + "timestamp": "2026-02-23T01:08:45Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_9b.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server", "tag:client", "tag:prod", "tag:router"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["tag:server", "tag:client", "tag:prod", "tag:router"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.92.142.61", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::3e37:8e3d", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.92.142.61/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::3e37:8e3d/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.83.200.69", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::c537:c845", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.83.200.69/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::c537:c845/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.103.8.15", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::5b37:80f", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.103.8.15/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::5b37:80f/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.108.74.26", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "fd7a:115c:a1e0::b901:4a87", "Ports": { "First": 22, "Last": 22 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.108.74.26/32", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "fd7a:115c:a1e0::b901:4a87/128", "Ports": { "First": 22, "Last": 22 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_9C.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_9C.json new file mode 100644 index 00000000..ec4b0688 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P09_9C.json @@ -0,0 +1,2879 @@ +{ + "test_id": "GRANT-P09_9C", + "timestamp": "2026-02-23T01:09:02Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p09_9c.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member", "autogroup:tagged"], + "dst": ["*"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:member", "autogroup:tagged"], "dst": ["*"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.103.90.82", + "100.108.74.26", + "100.110.121.96", + "100.83.200.69", + "100.85.66.106", + "100.90.199.68", + "100.92.142.61", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::9e37:5a52", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.103.90.82/32", + "100.108.74.26/32", + "100.110.121.96/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.90.199.68/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::9e37:5a52/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.103.90.82", + "100.108.74.26", + "100.110.121.96", + "100.83.200.69", + "100.85.66.106", + "100.90.199.68", + "100.92.142.61", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::9e37:5a52", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.103.90.82/32", + "100.108.74.26/32", + "100.110.121.96/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.90.199.68/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::9e37:5a52/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.103.90.82", + "100.108.74.26", + "100.110.121.96", + "100.83.200.69", + "100.85.66.106", + "100.90.199.68", + "100.92.142.61", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::9e37:5a52", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.103.90.82/32", + "100.108.74.26/32", + "100.110.121.96/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.90.199.68/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::9e37:5a52/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.103.90.82", + "100.108.74.26", + "100.110.121.96", + "100.83.200.69", + "100.85.66.106", + "100.90.199.68", + "100.92.142.61", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::9e37:5a52", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.103.90.82/32", + "100.108.74.26/32", + "100.110.121.96/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.90.199.68/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::9e37:5a52/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.103.90.82", + "100.108.74.26", + "100.110.121.96", + "100.83.200.69", + "100.85.66.106", + "100.90.199.68", + "100.92.142.61", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::9e37:5a52", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.103.90.82/32", + "100.108.74.26/32", + "100.110.121.96/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.90.199.68/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::9e37:5a52/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.103.90.82", + "100.108.74.26", + "100.110.121.96", + "100.83.200.69", + "100.85.66.106", + "100.90.199.68", + "100.92.142.61", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::9e37:5a52", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.103.90.82/32", + "100.108.74.26/32", + "100.110.121.96/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.90.199.68/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::9e37:5a52/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.103.90.82", + "100.108.74.26", + "100.110.121.96", + "100.83.200.69", + "100.85.66.106", + "100.90.199.68", + "100.92.142.61", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::9e37:5a52", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.103.90.82/32", + "100.108.74.26/32", + "100.110.121.96/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.90.199.68/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::9e37:5a52/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.8.15", + "100.103.90.82", + "100.108.74.26", + "100.110.121.96", + "100.83.200.69", + "100.85.66.106", + "100.90.199.68", + "100.92.142.61", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::3e37:8e3d", + "fd7a:115c:a1e0::5b37:80f", + "fd7a:115c:a1e0::7c37:426a", + "fd7a:115c:a1e0::9e37:5a52", + "fd7a:115c:a1e0::b901:4a87", + "fd7a:115c:a1e0::c537:c845" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.8.15/32", + "100.103.90.82/32", + "100.108.74.26/32", + "100.110.121.96/32", + "100.83.200.69/32", + "100.85.66.106/32", + "100.90.199.68/32", + "100.92.142.61/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::3e37:8e3d/128", + "fd7a:115c:a1e0::5b37:80f/128", + "fd7a:115c:a1e0::7c37:426a/128", + "fd7a:115c:a1e0::9e37:5a52/128", + "fd7a:115c:a1e0::b901:4a87/128", + "fd7a:115c:a1e0::c537:c845/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P10_1.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P10_1.json new file mode 100644 index 00000000..863d0de0 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P10_1.json @@ -0,0 +1,2775 @@ +{ + "test_id": "GRANT-P10_1", + "timestamp": "2026-02-23T01:09:19Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p10_1.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["*"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P10_2.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P10_2.json new file mode 100644 index 00000000..df662b5a --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P10_2.json @@ -0,0 +1,503 @@ +{ + "test_id": "GRANT-P10_2", + "timestamp": "2026-02-23T01:09:36Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p10_2.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:router"], + "dst": ["tag:router"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["tag:router"], "dst": ["tag:router"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.92.142.61", "fd7a:115c:a1e0::3e37:8e3d"], + "DstPorts": [ + { "IP": "100.92.142.61", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::3e37:8e3d", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.92.142.61/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::3e37:8e3d/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P10_3.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P10_3.json new file mode 100644 index 00000000..1824b9bc --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P10_3.json @@ -0,0 +1,1019 @@ +{ + "test_id": "GRANT-P10_3", + "timestamp": "2026-02-23T01:09:53Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p10_3.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["10.33.0.0/16"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["10.33.0.0/16"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "10.33.0.0/16", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [{ "Net": "10.33.0.0/16", "Ports": { "First": 0, "Last": 65535 } }], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P10_4.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P10_4.json new file mode 100644 index 00000000..d80c0328 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P10_4.json @@ -0,0 +1,728 @@ +{ + "test_id": "GRANT-P10_4", + "timestamp": "2026-02-23T01:10:09Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p10_4.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["10.33.0.0/16"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:member"], "dst": ["10.33.0.0/16"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [{ "IP": "10.33.0.0/16", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [{ "Net": "10.33.0.0/16", "Ports": { "First": 0, "Last": 65535 } }], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P11_1.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P11_1.json new file mode 100644 index 00000000..b9604d03 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P11_1.json @@ -0,0 +1,2775 @@ +{ + "test_id": "GRANT-P11_1", + "timestamp": "2026-02-23T01:10:26Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p11_1.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["*"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["*"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "*", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "0.0.0.0/0", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "::/0", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P11_2.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P11_2.json new file mode 100644 index 00000000..67a60576 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P11_2.json @@ -0,0 +1,503 @@ +{ + "test_id": "GRANT-P11_2", + "timestamp": "2026-02-23T01:10:43Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p11_2.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:exit"], + "dst": ["tag:exit"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["tag:exit"], "dst": ["tag:exit"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.85.66.106", "fd7a:115c:a1e0::7c37:426a"], + "DstPorts": [ + { "IP": "100.85.66.106", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::7c37:426a", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.85.66.106/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::7c37:426a/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P11_3.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P11_3.json new file mode 100644 index 00000000..cd2097de --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P11_3.json @@ -0,0 +1,484 @@ +{ + "test_id": "GRANT-P11_3", + "timestamp": "2026-02-23T01:11:00Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p11_3.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["autogroup:internet"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:member"], "dst": ["autogroup:internet"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P13_1.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P13_1.json new file mode 100644 index 00000000..a6fa376a --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P13_1.json @@ -0,0 +1,728 @@ +{ + "test_id": "GRANT-P13_1", + "timestamp": "2026-02-23T01:11:17Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p13_1.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["10.33.0.0/16"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:member"], "dst": ["10.33.0.0/16"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [{ "IP": "10.33.0.0/16", "Ports": { "First": 22, "Last": 22 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [{ "Net": "10.33.0.0/16", "Ports": { "First": 22, "Last": 22 } }], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P13_2.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P13_2.json new file mode 100644 index 00000000..9e5983eb --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P13_2.json @@ -0,0 +1,1019 @@ +{ + "test_id": "GRANT-P13_2", + "timestamp": "2026-02-23T01:11:34Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p13_2.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["10.33.0.0/16"], + "ip": ["80-443"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["10.33.0.0/16"], "ip": ["80-443"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "10.33.0.0/16", "Ports": { "First": 80, "Last": 443 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [{ "Net": "10.33.0.0/16", "Ports": { "First": 80, "Last": 443 } }], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P13_3.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P13_3.json new file mode 100644 index 00000000..dfc06439 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P13_3.json @@ -0,0 +1,1027 @@ +{ + "test_id": "GRANT-P13_3", + "timestamp": "2026-02-23T01:11:50Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p13_3.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["10.33.0.0/16"], + "ip": ["22", "80", "443"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["10.33.0.0/16"], "ip": ["22", "80", "443"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "10.33.0.0/16", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "10.33.0.0/16", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "10.33.0.0/16", "Ports": { "First": 443, "Last": 443 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "10.33.0.0/16", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "10.33.0.0/16", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "10.33.0.0/16", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:e067b4e63320882c9a744baff8b1d9de50fad897586d9ac2033723343a66e946", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:38956", + "10.65.0.27:38956", + "172.17.0.1:38956", + "172.18.0.1:38956", + "172.19.0.1:38956" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:f3f4cc194a00c26e6bd6ca6947a86ba8609fc759c469922205f1db9a5ab78c46", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:58209", + "10.65.0.27:58209", + "172.17.0.1:58209", + "172.18.0.1:58209", + "172.19.0.1:58209" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:196d9d1d9f0e2d5c5da0dc70164b6752bf8ad896991b7038b2272cb0bf8bf630", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:46099", + "10.65.0.27:46099", + "172.17.0.1:46099", + "172.18.0.1:46099", + "172.19.0.1:46099" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:372ff501f45d63e009ed97902f8b3acf6addd79e9c6ca7343d41c7adc4eb3e38", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:58686", + "10.65.0.27:58686", + "172.17.0.1:58686", + "172.18.0.1:58686", + "172.19.0.1:58686" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P13_4.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P13_4.json new file mode 100644 index 00000000..5df6f0e5 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P13_4.json @@ -0,0 +1,758 @@ +{ + "test_id": "GRANT-P13_4", + "timestamp": "2026-02-23T01:12:07Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p13_4.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["10.33.0.0/16"], + "dst": ["autogroup:member"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["10.33.0.0/16"], "dst": ["autogroup:member"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["10.33.0.0/16"], + "DstPorts": [ + { "IP": "100.110.121.96", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::1737:7960", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["10.33.0.0/16"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.110.121.96/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::1737:7960/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["10.33.0.0/16"], + "DstPorts": [ + { "IP": "100.103.90.82", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::9e37:5a52", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["10.33.0.0/16"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.103.90.82/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::9e37:5a52/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["10.33.0.0/16"], + "DstPorts": [ + { "IP": "100.90.199.68", "Ports": { "First": 0, "Last": 65535 } }, + { "IP": "fd7a:115c:a1e0::2d01:c747", "Ports": { "First": 0, "Last": 65535 } } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["10.33.0.0/16"], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.90.199.68/32", "Ports": { "First": 0, "Last": 65535 } }, + { "Net": "fd7a:115c:a1e0::2d01:c747/128", "Ports": { "First": 0, "Last": 65535 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P15_1.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P15_1.json new file mode 100644 index 00000000..bb17a193 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P15_1.json @@ -0,0 +1,728 @@ +{ + "test_id": "GRANT-P15_1", + "timestamp": "2026-02-23T01:12:24Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p15_1.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["10.33.1.0/24"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:member"], "dst": ["10.33.1.0/24"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [{ "IP": "10.33.1.0/24", "Ports": { "First": 22, "Last": 22 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [{ "Net": "10.33.1.0/24", "Ports": { "First": 22, "Last": 22 } }], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P15_2.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P15_2.json new file mode 100644 index 00000000..8273c891 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P15_2.json @@ -0,0 +1,484 @@ +{ + "test_id": "GRANT-P15_2", + "timestamp": "2026-02-23T01:12:41Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p15_2.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["10.1.0.0/16"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:member"], "dst": ["10.1.0.0/16"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P15_3.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P15_3.json new file mode 100644 index 00000000..edb137ab --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P15_3.json @@ -0,0 +1,728 @@ +{ + "test_id": "GRANT-P15_3", + "timestamp": "2026-02-23T01:12:57Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p15_3.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["10.32.0.0/14"], + "ip": ["22"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:member"], "dst": ["10.32.0.0/14"], "ip": ["22"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [{ "IP": "10.32.0.0/14", "Ports": { "First": 22, "Last": 22 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [{ "Net": "10.32.0.0/14", "Ports": { "First": 22, "Last": 22 } }], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:ee276d29d944b727d1749cd3938f210d3c30f1e2d2644fed60632fc0a3c95066", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:36065", + "10.65.0.27:36065", + "172.17.0.1:36065", + "172.18.0.1:36065", + "172.19.0.1:36065" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:0fe29575d3fe2b01154e0d8f5b8fa1d2500a55fd2aa79a416f014f4c1e217e7b", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:49306", + "10.65.0.27:49306", + "172.17.0.1:49306", + "172.18.0.1:49306", + "172.19.0.1:49306" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:e9a76408333d29ad7c495ff79483f15d0bae079bfebc20cffa35af12fe848518", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:59336", + "10.65.0.27:59336", + "172.17.0.1:59336", + "172.18.0.1:59336", + "172.19.0.1:59336" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:861e592754ea9209e6ab02a511369b304e9094c6d636c270d746d9ddb954534d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:45900", + "10.65.0.27:45900", + "172.17.0.1:45900", + "172.18.0.1:45900", + "172.19.0.1:45900" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P15_4.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P15_4.json new file mode 100644 index 00000000..8cf8a9ee --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P15_4.json @@ -0,0 +1,484 @@ +{ + "test_id": "GRANT-P15_4", + "timestamp": "2026-02-23T01:13:14Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p15_4.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["8.8.8.0/24"], + "ip": ["53"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:member"], "dst": ["8.8.8.0/24"], "ip": ["53"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P15_5.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P15_5.json new file mode 100644 index 00000000..eb880715 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P15_5.json @@ -0,0 +1,484 @@ +{ + "test_id": "GRANT-P15_5", + "timestamp": "2026-02-23T01:13:31Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p15_5.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["10.32.0.100/32"], + "ip": ["80"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:member"], "dst": ["10.32.0.100/32"], "ip": ["80"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-P15_6.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-P15_6.json new file mode 100644 index 00000000..b9c4a253 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-P15_6.json @@ -0,0 +1,484 @@ +{ + "test_id": "GRANT-P15_6", + "timestamp": "2026-02-23T01:13:48Z", + "propagation_wait_seconds": 15, + "input": { + "policy_file": "/home/kradalby/acl-explore/grant_policies/grant_p15_6.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["fd00:1::/64"], + "ip": ["443"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:member"], "dst": ["fd00:1::/64"], "ip": ["443"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V01.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V01.json new file mode 100644 index 00000000..c467cb5e --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V01.json @@ -0,0 +1,60 @@ +{ + "test_id": "GRANT-V01", + "description": "", + "timestamp": "2026-02-23T15:12:54Z", + "error": true, + "input": { + "policy_file": "grant_policies_v2/grant_v01.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["autogroup:internet"], + "app": { + "example.com/cap/internet-access": [ + { + "level": "full" + } + ] + } + } + ] + }, + "grants_section": [ + { + "src": ["*"], + "dst": ["autogroup:internet"], + "app": { "example.com/cap/internet-access": [{ "level": "full" }] } + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "cannot use app grants with autogroup:internet" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V02.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V02.json new file mode 100644 index 00000000..8ebdb4f9 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V02.json @@ -0,0 +1,1033 @@ +{ + "test_id": "GRANT-V02", + "timestamp": "2026-02-23T15:39:40Z", + "propagation_wait_seconds": 8, + "input": { + "policy_file": "grant_policies_v2/grant_v02.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:exit"], + "app": { + "example.com/cap/exit-control": [ + { + "mode": "full" + } + ] + } + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["tag:exit"], "app": { "example.com/cap/exit-control": [{ "mode": "full" }] } } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "example.com/cap/exit-control": [{ "mode": "full" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "example.com/cap/exit-control", "Values": [{ "mode": "full" }] }, + { + "Dst": "fd7a:115c:a1e0::7c37:426a/128", + "Cap": "example.com/cap/exit-control", + "Values": [{ "mode": "full" }] + } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/exit-control": [{ "mode": "full" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:7e9099516456f84f9af01c51ce03bc38764c4c02bf6c73a6d4b2495771a6c449", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:47452", + "10.65.0.27:47452", + "172.17.0.1:47452", + "172.18.0.1:47452", + "172.19.0.1:47452" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/exit-control": [{ "mode": "full" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:2dd2ca7f9f1378d3ec23a7d6ba57a735032f9a4f90b6c95b2c2385950ec7ae45", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:54907", + "10.65.0.27:54907", + "172.17.0.1:54907", + "172.18.0.1:54907", + "172.19.0.1:54907" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/exit-control": [{ "mode": "full" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:9f71ff1e1652916263ef05d0a5e9d9e18239aa598f956b24c563c03a1088cb39", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:34495", + "10.65.0.27:34495", + "172.17.0.1:34495", + "172.18.0.1:34495", + "172.19.0.1:34495" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/exit-control": [{ "mode": "full" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:9841ea823abefc7197a67b2b33ba551868a344e64ecd27e00d1a100e5e9e5427", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:42311", + "10.65.0.27:42311", + "172.17.0.1:42311", + "172.18.0.1:42311", + "172.19.0.1:42311" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/exit-control": [{ "mode": "full" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:733598f0f74431b5b2b28fb5980d8b2f79b5ca5524664998d1d011a651643211", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:50398", + "10.65.0.27:50398", + "172.17.0.1:50398", + "172.18.0.1:50398", + "172.19.0.1:50398" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/exit-control": [{ "mode": "full" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:203d3bfbd67a06d210c027c546a05658fba93aeaea5042b12d50b93d31a5d156", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:44240", + "10.65.0.27:44240", + "172.17.0.1:44240", + "172.18.0.1:44240", + "172.19.0.1:44240" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/exit-control": [{ "mode": "full" }] } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V03.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V03.json new file mode 100644 index 00000000..b3b46e8a --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V03.json @@ -0,0 +1,1032 @@ +{ + "test_id": "GRANT-V03", + "timestamp": "2026-02-23T15:39:49Z", + "propagation_wait_seconds": 8, + "input": { + "policy_file": "grant_policies_v2/grant_v03.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:router"], + "app": { + "example.com/cap/router-admin": [ + { + "role": "admin" + } + ] + } + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["tag:router"], "app": { "example.com/cap/router-admin": [{ "role": "admin" }] } } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "example.com/cap/router-admin": [{ "role": "admin" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "example.com/cap/router-admin", "Values": [{ "role": "admin" }] }, + { + "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", + "Cap": "example.com/cap/router-admin", + "Values": [{ "role": "admin" }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/router-admin": [{ "role": "admin" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:7e9099516456f84f9af01c51ce03bc38764c4c02bf6c73a6d4b2495771a6c449", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:47452", + "10.65.0.27:47452", + "172.17.0.1:47452", + "172.18.0.1:47452", + "172.19.0.1:47452" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/router-admin": [{ "role": "admin" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:2dd2ca7f9f1378d3ec23a7d6ba57a735032f9a4f90b6c95b2c2385950ec7ae45", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:54907", + "10.65.0.27:54907", + "172.17.0.1:54907", + "172.18.0.1:54907", + "172.19.0.1:54907" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/router-admin": [{ "role": "admin" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:9f71ff1e1652916263ef05d0a5e9d9e18239aa598f956b24c563c03a1088cb39", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:34495", + "10.65.0.27:34495", + "172.17.0.1:34495", + "172.18.0.1:34495", + "172.19.0.1:34495" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/router-admin": [{ "role": "admin" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:9841ea823abefc7197a67b2b33ba551868a344e64ecd27e00d1a100e5e9e5427", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:42311", + "10.65.0.27:42311", + "172.17.0.1:42311", + "172.18.0.1:42311", + "172.19.0.1:42311" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/router-admin": [{ "role": "admin" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:733598f0f74431b5b2b28fb5980d8b2f79b5ca5524664998d1d011a651643211", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:50398", + "10.65.0.27:50398", + "172.17.0.1:50398", + "172.18.0.1:50398", + "172.19.0.1:50398" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/router-admin": [{ "role": "admin" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:203d3bfbd67a06d210c027c546a05658fba93aeaea5042b12d50b93d31a5d156", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:44240", + "10.65.0.27:44240", + "172.17.0.1:44240", + "172.18.0.1:44240", + "172.19.0.1:44240" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/router-admin": [{ "role": "admin" }] } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V04.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V04.json new file mode 100644 index 00000000..20cfefc5 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V04.json @@ -0,0 +1,52 @@ +{ + "test_id": "GRANT-V04", + "description": "", + "timestamp": "2026-02-23T15:39:59Z", + "error": true, + "input": { + "policy_file": "grant_policies_v2/grant_v04.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["0.0.0.0/0"], + "app": { + "example.com/cap/global-access": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["0.0.0.0/0"], "app": { "example.com/cap/global-access": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { + "message": "dst \"0.0.0.0/0\": to allow all IP addresses, use \"*\" or \"autogroup:internet\"" + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V05.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V05.json new file mode 100644 index 00000000..429dd519 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V05.json @@ -0,0 +1,50 @@ +{ + "test_id": "GRANT-V05", + "description": "", + "timestamp": "2026-02-23T15:39:59Z", + "error": true, + "input": { + "policy_file": "grant_policies_v2/grant_v05.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["::/0"], + "app": { + "example.com/cap/global-v6": [{}] + } + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["::/0"], "app": { "example.com/cap/global-v6": [{}] } }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "dst \"::/0\": to allow all IP addresses, use \"*\" or \"autogroup:internet\"" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V06.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V06.json new file mode 100644 index 00000000..fbda0bb2 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V06.json @@ -0,0 +1,1504 @@ +{ + "test_id": "GRANT-V06", + "timestamp": "2026-02-23T15:39:59Z", + "propagation_wait_seconds": 8, + "input": { + "policy_file": "grant_policies_v2/grant_v06.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:server", "tag:exit"], + "app": { + "example.com/cap/multi-dst": [ + { + "scope": "both" + } + ] + } + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["tag:server", "tag:exit"], "app": { "example.com/cap/multi-dst": [{ "scope": "both" }] } } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "example.com/cap/multi-dst": [{ "scope": "both" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "example.com/cap/multi-dst", "Values": [{ "scope": "both" }] }, + { + "Dst": "fd7a:115c:a1e0::7c37:426a/128", + "Cap": "example.com/cap/multi-dst", + "Values": [{ "scope": "both" }] + } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/multi-dst": [{ "scope": "both" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:7e9099516456f84f9af01c51ce03bc38764c4c02bf6c73a6d4b2495771a6c449", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:47452", + "10.65.0.27:47452", + "172.17.0.1:47452", + "172.18.0.1:47452", + "172.19.0.1:47452" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/multi-dst": [{ "scope": "both" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:2dd2ca7f9f1378d3ec23a7d6ba57a735032f9a4f90b6c95b2c2385950ec7ae45", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:54907", + "10.65.0.27:54907", + "172.17.0.1:54907", + "172.18.0.1:54907", + "172.19.0.1:54907" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/multi-dst": [{ "scope": "both" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:9f71ff1e1652916263ef05d0a5e9d9e18239aa598f956b24c563c03a1088cb39", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:34495", + "10.65.0.27:34495", + "172.17.0.1:34495", + "172.18.0.1:34495", + "172.19.0.1:34495" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/multi-dst": [{ "scope": "both" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:9841ea823abefc7197a67b2b33ba551868a344e64ecd27e00d1a100e5e9e5427", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:42311", + "10.65.0.27:42311", + "172.17.0.1:42311", + "172.18.0.1:42311", + "172.19.0.1:42311" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/multi-dst": [{ "scope": "both" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:733598f0f74431b5b2b28fb5980d8b2f79b5ca5524664998d1d011a651643211", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:50398", + "10.65.0.27:50398", + "172.17.0.1:50398", + "172.18.0.1:50398", + "172.19.0.1:50398" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/multi-dst": [{ "scope": "both" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:203d3bfbd67a06d210c027c546a05658fba93aeaea5042b12d50b93d31a5d156", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:44240", + "10.65.0.27:44240", + "172.17.0.1:44240", + "172.18.0.1:44240", + "172.19.0.1:44240" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/multi-dst": [{ "scope": "both" }] } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:9f71ff1e1652916263ef05d0a5e9d9e18239aa598f956b24c563c03a1088cb39", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:34495", + "10.65.0.27:34495", + "172.17.0.1:34495", + "172.18.0.1:34495", + "172.19.0.1:34495" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:9f71ff1e1652916263ef05d0a5e9d9e18239aa598f956b24c563c03a1088cb39", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:34495", + "10.65.0.27:34495", + "172.17.0.1:34495", + "172.18.0.1:34495", + "172.19.0.1:34495" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:9f71ff1e1652916263ef05d0a5e9d9e18239aa598f956b24c563c03a1088cb39", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:34495", + "10.65.0.27:34495", + "172.17.0.1:34495", + "172.18.0.1:34495", + "172.19.0.1:34495" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "CapMap": { "example.com/cap/multi-dst": [{ "scope": "both" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.108.74.26/32", "Cap": "example.com/cap/multi-dst", "Values": [{ "scope": "both" }] }, + { + "Dst": "fd7a:115c:a1e0::b901:4a87/128", + "Cap": "example.com/cap/multi-dst", + "Values": [{ "scope": "both" }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/multi-dst": [{ "scope": "both" }] } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/multi-dst": [{ "scope": "both" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:7e9099516456f84f9af01c51ce03bc38764c4c02bf6c73a6d4b2495771a6c449", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:47452", + "10.65.0.27:47452", + "172.17.0.1:47452", + "172.18.0.1:47452", + "172.19.0.1:47452" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/multi-dst": [{ "scope": "both" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:2dd2ca7f9f1378d3ec23a7d6ba57a735032f9a4f90b6c95b2c2385950ec7ae45", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:54907", + "10.65.0.27:54907", + "172.17.0.1:54907", + "172.18.0.1:54907", + "172.19.0.1:54907" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/multi-dst": [{ "scope": "both" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:9841ea823abefc7197a67b2b33ba551868a344e64ecd27e00d1a100e5e9e5427", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:42311", + "10.65.0.27:42311", + "172.17.0.1:42311", + "172.18.0.1:42311", + "172.19.0.1:42311" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/multi-dst": [{ "scope": "both" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:733598f0f74431b5b2b28fb5980d8b2f79b5ca5524664998d1d011a651643211", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:50398", + "10.65.0.27:50398", + "172.17.0.1:50398", + "172.18.0.1:50398", + "172.19.0.1:50398" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/multi-dst": [{ "scope": "both" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:203d3bfbd67a06d210c027c546a05658fba93aeaea5042b12d50b93d31a5d156", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:44240", + "10.65.0.27:44240", + "172.17.0.1:44240", + "172.18.0.1:44240", + "172.19.0.1:44240" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/multi-dst": [{ "scope": "both" }] } + } + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:9f71ff1e1652916263ef05d0a5e9d9e18239aa598f956b24c563c03a1088cb39", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:34495", + "10.65.0.27:34495", + "172.17.0.1:34495", + "172.18.0.1:34495", + "172.19.0.1:34495" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:9f71ff1e1652916263ef05d0a5e9d9e18239aa598f956b24c563c03a1088cb39", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:34495", + "10.65.0.27:34495", + "172.17.0.1:34495", + "172.18.0.1:34495", + "172.19.0.1:34495" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:9f71ff1e1652916263ef05d0a5e9d9e18239aa598f956b24c563c03a1088cb39", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:34495", + "10.65.0.27:34495", + "172.17.0.1:34495", + "172.18.0.1:34495", + "172.19.0.1:34495" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V07.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V07.json new file mode 100644 index 00000000..eab8a5f3 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V07.json @@ -0,0 +1,484 @@ +{ + "test_id": "GRANT-V07", + "timestamp": "2026-02-23T15:40:09Z", + "propagation_wait_seconds": 8, + "input": { + "policy_file": "grant_policies_v2/grant_v07.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["autogroup:internet"], + "ip": ["tcp:443"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["autogroup:internet"], "ip": ["tcp:443"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V08.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V08.json new file mode 100644 index 00000000..e844c3e2 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V08.json @@ -0,0 +1,50 @@ +{ + "test_id": "GRANT-V08", + "description": "", + "timestamp": "2026-02-23T15:40:19Z", + "error": true, + "input": { + "policy_file": "grant_policies_v2/grant_v08.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["0.0.0.0/0"], + "ip": ["tcp:80", "tcp:443"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["0.0.0.0/0"], "ip": ["tcp:80", "tcp:443"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { + "message": "dst \"0.0.0.0/0\": to allow all IP addresses, use \"*\" or \"autogroup:internet\"" + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V09.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V09.json new file mode 100644 index 00000000..ac192bd1 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V09.json @@ -0,0 +1,1078 @@ +{ + "test_id": "GRANT-V09", + "timestamp": "2026-02-23T15:40:19Z", + "propagation_wait_seconds": 8, + "input": { + "policy_file": "grant_policies_v2/grant_v09.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:exit"], + "ip": ["tcp:443"], + "app": { + "example.com/cap/exit-mixed": [ + { + "mode": "proxy" + } + ] + } + } + ] + }, + "grants_section": [ + { + "src": ["*"], + "dst": ["tag:exit"], + "ip": ["tcp:443"], + "app": { "example.com/cap/exit-mixed": [{ "mode": "proxy" }] } + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.85.66.106", "Ports": { "First": 443, "Last": 443 } }, + { "IP": "fd7a:115c:a1e0::7c37:426a", "Ports": { "First": 443, "Last": 443 } } + ], + "IPProto": [6] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "example.com/cap/exit-mixed": [{ "mode": "proxy" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.85.66.106/32", "Ports": { "First": 443, "Last": 443 } }, + { "Net": "fd7a:115c:a1e0::7c37:426a/128", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.85.66.106/32", "Cap": "example.com/cap/exit-mixed", "Values": [{ "mode": "proxy" }] }, + { + "Dst": "fd7a:115c:a1e0::7c37:426a/128", + "Cap": "example.com/cap/exit-mixed", + "Values": [{ "mode": "proxy" }] + } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/exit-mixed": [{ "mode": "proxy" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:7e9099516456f84f9af01c51ce03bc38764c4c02bf6c73a6d4b2495771a6c449", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:47452", + "10.65.0.27:47452", + "172.17.0.1:47452", + "172.18.0.1:47452", + "172.19.0.1:47452" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/exit-mixed": [{ "mode": "proxy" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:2dd2ca7f9f1378d3ec23a7d6ba57a735032f9a4f90b6c95b2c2385950ec7ae45", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:54907", + "10.65.0.27:54907", + "172.17.0.1:54907", + "172.18.0.1:54907", + "172.19.0.1:54907" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/exit-mixed": [{ "mode": "proxy" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:9f71ff1e1652916263ef05d0a5e9d9e18239aa598f956b24c563c03a1088cb39", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:34495", + "10.65.0.27:34495", + "172.17.0.1:34495", + "172.18.0.1:34495", + "172.19.0.1:34495" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/exit-mixed": [{ "mode": "proxy" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:9841ea823abefc7197a67b2b33ba551868a344e64ecd27e00d1a100e5e9e5427", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:42311", + "10.65.0.27:42311", + "172.17.0.1:42311", + "172.18.0.1:42311", + "172.19.0.1:42311" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/exit-mixed": [{ "mode": "proxy" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:733598f0f74431b5b2b28fb5980d8b2f79b5ca5524664998d1d011a651643211", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:50398", + "10.65.0.27:50398", + "172.17.0.1:50398", + "172.18.0.1:50398", + "172.19.0.1:50398" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/exit-mixed": [{ "mode": "proxy" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:203d3bfbd67a06d210c027c546a05658fba93aeaea5042b12d50b93d31a5d156", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:44240", + "10.65.0.27:44240", + "172.17.0.1:44240", + "172.18.0.1:44240", + "172.19.0.1:44240" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/exit-mixed": [{ "mode": "proxy" }] } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V10.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V10.json new file mode 100644 index 00000000..e708a7aa --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V10.json @@ -0,0 +1,1077 @@ +{ + "test_id": "GRANT-V10", + "timestamp": "2026-02-23T15:40:28Z", + "propagation_wait_seconds": 8, + "input": { + "policy_file": "grant_policies_v2/grant_v10.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["tag:router"], + "ip": ["tcp:80"], + "app": { + "example.com/cap/router-mixed": [ + { + "role": "viewer" + } + ] + } + } + ] + }, + "grants_section": [ + { + "src": ["*"], + "dst": ["tag:router"], + "ip": ["tcp:80"], + "app": { "example.com/cap/router-mixed": [{ "role": "viewer" }] } + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "100.92.142.61", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "fd7a:115c:a1e0::3e37:8e3d", "Ports": { "First": 80, "Last": 80 } } + ], + "IPProto": [6] + }, + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "example.com/cap/router-mixed": [{ "role": "viewer" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "100.92.142.61/32", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "fd7a:115c:a1e0::3e37:8e3d/128", "Ports": { "First": 80, "Last": 80 } } + ], + "Caps": [] + }, + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.92.142.61/32", "Cap": "example.com/cap/router-mixed", "Values": [{ "role": "viewer" }] }, + { + "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", + "Cap": "example.com/cap/router-mixed", + "Values": [{ "role": "viewer" }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/router-mixed": [{ "role": "viewer" }] } + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:7e9099516456f84f9af01c51ce03bc38764c4c02bf6c73a6d4b2495771a6c449", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:47452", + "10.65.0.27:47452", + "172.17.0.1:47452", + "172.18.0.1:47452", + "172.19.0.1:47452" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/router-mixed": [{ "role": "viewer" }] } + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:2dd2ca7f9f1378d3ec23a7d6ba57a735032f9a4f90b6c95b2c2385950ec7ae45", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:54907", + "10.65.0.27:54907", + "172.17.0.1:54907", + "172.18.0.1:54907", + "172.19.0.1:54907" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/router-mixed": [{ "role": "viewer" }] } + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:9f71ff1e1652916263ef05d0a5e9d9e18239aa598f956b24c563c03a1088cb39", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:34495", + "10.65.0.27:34495", + "172.17.0.1:34495", + "172.18.0.1:34495", + "172.19.0.1:34495" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "example.com/cap/router-mixed": [{ "role": "viewer" }] } + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:9841ea823abefc7197a67b2b33ba551868a344e64ecd27e00d1a100e5e9e5427", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:42311", + "10.65.0.27:42311", + "172.17.0.1:42311", + "172.18.0.1:42311", + "172.19.0.1:42311" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "example.com/cap/router-mixed": [{ "role": "viewer" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:733598f0f74431b5b2b28fb5980d8b2f79b5ca5524664998d1d011a651643211", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:50398", + "10.65.0.27:50398", + "172.17.0.1:50398", + "172.18.0.1:50398", + "172.19.0.1:50398" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "example.com/cap/router-mixed": [{ "role": "viewer" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:203d3bfbd67a06d210c027c546a05658fba93aeaea5042b12d50b93d31a5d156", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:44240", + "10.65.0.27:44240", + "172.17.0.1:44240", + "172.18.0.1:44240", + "172.19.0.1:44240" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "example.com/cap/router-mixed": [{ "role": "viewer" }] } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V11.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V11.json new file mode 100644 index 00000000..86e54308 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V11.json @@ -0,0 +1,569 @@ +{ + "test_id": "GRANT-V11", + "timestamp": "2026-02-23T15:40:38Z", + "propagation_wait_seconds": 8, + "input": { + "policy_file": "grant_policies_v2/grant_v11.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:client"], + "dst": ["10.33.0.0/16"], + "via": ["tag:router"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["tag:client"], "dst": ["10.33.0.0/16"], "via": ["tag:router"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.83.200.69", "fd7a:115c:a1e0::c537:c845"], + "DstPorts": [{ "IP": "10.33.0.0/16", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "SrcCaps": null, + "Dsts": [{ "Net": "10.33.0.0/16", "Ports": { "First": 0, "Last": 65535 } }], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:7e9099516456f84f9af01c51ce03bc38764c4c02bf6c73a6d4b2495771a6c449", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:47452", + "10.65.0.27:47452", + "172.17.0.1:47452", + "172.18.0.1:47452", + "172.19.0.1:47452" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V12.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V12.json new file mode 100644 index 00000000..a96746d0 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V12.json @@ -0,0 +1,729 @@ +{ + "test_id": "GRANT-V12", + "timestamp": "2026-02-23T15:40:48Z", + "propagation_wait_seconds": 8, + "input": { + "policy_file": "grant_policies_v2/grant_v12.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["10.33.0.0/16"], + "via": ["tag:router"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["autogroup:member"], "dst": ["10.33.0.0/16"], "via": ["tag:router"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "DstPorts": [{ "IP": "10.33.0.0/16", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [{ "Net": "10.33.0.0/16", "Ports": { "First": 0, "Last": 65535 } }], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:9841ea823abefc7197a67b2b33ba551868a344e64ecd27e00d1a100e5e9e5427", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:42311", + "10.65.0.27:42311", + "172.17.0.1:42311", + "172.18.0.1:42311", + "172.19.0.1:42311" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:733598f0f74431b5b2b28fb5980d8b2f79b5ca5524664998d1d011a651643211", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:50398", + "10.65.0.27:50398", + "172.17.0.1:50398", + "172.18.0.1:50398", + "172.19.0.1:50398" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:203d3bfbd67a06d210c027c546a05658fba93aeaea5042b12d50b93d31a5d156", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:44240", + "10.65.0.27:44240", + "172.17.0.1:44240", + "172.18.0.1:44240", + "172.19.0.1:44240" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V13.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V13.json new file mode 100644 index 00000000..9e12260c --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V13.json @@ -0,0 +1,654 @@ +{ + "test_id": "GRANT-V13", + "timestamp": "2026-02-23T15:40:58Z", + "propagation_wait_seconds": 8, + "input": { + "policy_file": "grant_policies_v2/grant_v13.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["group:developers"], + "dst": ["10.33.0.0/16"], + "via": ["tag:router"], + "ip": ["tcp:80", "tcp:443"] + } + ] + }, + "grants_section": [ + { "src": ["group:developers"], "dst": ["10.33.0.0/16"], "via": ["tag:router"], "ip": ["tcp:80", "tcp:443"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.110.121.96", "100.90.199.68", "fd7a:115c:a1e0::1737:7960", "fd7a:115c:a1e0::2d01:c747"], + "DstPorts": [ + { "IP": "10.33.0.0/16", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "10.33.0.0/16", "Ports": { "First": 443, "Last": 443 } } + ], + "IPProto": [6] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "10.33.0.0/16", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "10.33.0.0/16", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:9841ea823abefc7197a67b2b33ba551868a344e64ecd27e00d1a100e5e9e5427", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:42311", + "10.65.0.27:42311", + "172.17.0.1:42311", + "172.18.0.1:42311", + "172.19.0.1:42311" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:203d3bfbd67a06d210c027c546a05658fba93aeaea5042b12d50b93d31a5d156", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:44240", + "10.65.0.27:44240", + "172.17.0.1:44240", + "172.18.0.1:44240", + "172.19.0.1:44240" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V14.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V14.json new file mode 100644 index 00000000..1dc791da --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V14.json @@ -0,0 +1,51 @@ +{ + "test_id": "GRANT-V14", + "description": "", + "timestamp": "2026-02-23T15:41:14Z", + "error": true, + "input": { + "policy_file": "grant_policies_v2/grant_v14.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["0.0.0.0/0"], + "via": ["tag:exit"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["0.0.0.0/0"], "via": ["tag:exit"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { + "message": "dst \"0.0.0.0/0\": to allow all IP addresses, use \"*\" or \"autogroup:internet\"" + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V15.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V15.json new file mode 100644 index 00000000..0b14fdd1 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V15.json @@ -0,0 +1,49 @@ +{ + "test_id": "GRANT-V15", + "description": "", + "timestamp": "2026-02-23T15:41:14Z", + "error": true, + "input": { + "policy_file": "grant_policies_v2/grant_v15.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["::/0"], + "via": ["tag:exit"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["::/0"], "via": ["tag:exit"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "dst \"::/0\": to allow all IP addresses, use \"*\" or \"autogroup:internet\"" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V16.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V16.json new file mode 100644 index 00000000..04d46049 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V16.json @@ -0,0 +1,51 @@ +{ + "test_id": "GRANT-V16", + "description": "", + "timestamp": "2026-02-23T15:41:15Z", + "error": true, + "input": { + "policy_file": "grant_policies_v2/grant_v16.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["0.0.0.0/0", "::/0"], + "via": ["tag:exit"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["0.0.0.0/0", "::/0"], "via": ["tag:exit"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { + "message": "dst \"0.0.0.0/0\": to allow all IP addresses, use \"*\" or \"autogroup:internet\"" + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V17.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V17.json new file mode 100644 index 00000000..9abe54c9 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V17.json @@ -0,0 +1,1020 @@ +{ + "test_id": "GRANT-V17", + "timestamp": "2026-02-23T15:41:15Z", + "propagation_wait_seconds": 8, + "input": { + "policy_file": "grant_policies_v2/grant_v17.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["10.33.0.0/16", "192.168.1.0/24"], + "via": ["tag:router"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["10.33.0.0/16", "192.168.1.0/24"], "via": ["tag:router"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "10.33.0.0/16", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [{ "Net": "10.33.0.0/16", "Ports": { "First": 0, "Last": 65535 } }], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:7e9099516456f84f9af01c51ce03bc38764c4c02bf6c73a6d4b2495771a6c449", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:47452", + "10.65.0.27:47452", + "172.17.0.1:47452", + "172.18.0.1:47452", + "172.19.0.1:47452" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:2dd2ca7f9f1378d3ec23a7d6ba57a735032f9a4f90b6c95b2c2385950ec7ae45", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:54907", + "10.65.0.27:54907", + "172.17.0.1:54907", + "172.18.0.1:54907", + "172.19.0.1:54907" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:9f71ff1e1652916263ef05d0a5e9d9e18239aa598f956b24c563c03a1088cb39", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:34495", + "10.65.0.27:34495", + "172.17.0.1:34495", + "172.18.0.1:34495", + "172.19.0.1:34495" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:9841ea823abefc7197a67b2b33ba551868a344e64ecd27e00d1a100e5e9e5427", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:42311", + "10.65.0.27:42311", + "172.17.0.1:42311", + "172.18.0.1:42311", + "172.19.0.1:42311" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:733598f0f74431b5b2b28fb5980d8b2f79b5ca5524664998d1d011a651643211", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:50398", + "10.65.0.27:50398", + "172.17.0.1:50398", + "172.18.0.1:50398", + "172.19.0.1:50398" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:203d3bfbd67a06d210c027c546a05658fba93aeaea5042b12d50b93d31a5d156", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:44240", + "10.65.0.27:44240", + "172.17.0.1:44240", + "172.18.0.1:44240", + "172.19.0.1:44240" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V18.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V18.json new file mode 100644 index 00000000..0e222d91 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V18.json @@ -0,0 +1,55 @@ +{ + "test_id": "GRANT-V18", + "description": "", + "timestamp": "2026-02-23T15:41:24Z", + "error": true, + "input": { + "policy_file": "grant_policies_v2/grant_v18.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["0.0.0.0/0"], + "via": ["tag:exit"], + "app": { + "example.com/cap/exit-via-app": [{}] + } + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["0.0.0.0/0"], "via": ["tag:exit"], "app": { "example.com/cap/exit-via-app": [{}] } } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { + "message": "dst \"0.0.0.0/0\": to allow all IP addresses, use \"*\" or \"autogroup:internet\"" + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V19.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V19.json new file mode 100644 index 00000000..720fc287 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V19.json @@ -0,0 +1,817 @@ +{ + "test_id": "GRANT-V19", + "timestamp": "2026-02-23T15:41:24Z", + "propagation_wait_seconds": 8, + "input": { + "policy_file": "grant_policies_v2/grant_v19.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["tag:exit"], + "app": { + "tailscale.com/cap/drive": [ + { + "shares": ["*"], + "access": "rw" + } + ] + } + } + ] + }, + "grants_section": [ + { + "src": ["autogroup:member"], + "dst": ["tag:exit"], + "app": { "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] } + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "CapGrant": [ + { + "Dsts": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.85.66.106/32", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + }, + { + "Dst": "fd7a:115c:a1e0::7c37:426a/128", + "Cap": "tailscale.com/cap/drive", + "Values": [{ "shares": ["*"], "access": "rw" }] + } + ] + } + ], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:9841ea823abefc7197a67b2b33ba551868a344e64ecd27e00d1a100e5e9e5427", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:42311", + "10.65.0.27:42311", + "172.17.0.1:42311", + "172.18.0.1:42311", + "172.19.0.1:42311" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:733598f0f74431b5b2b28fb5980d8b2f79b5ca5524664998d1d011a651643211", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:50398", + "10.65.0.27:50398", + "172.17.0.1:50398", + "172.18.0.1:50398", + "172.19.0.1:50398" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:203d3bfbd67a06d210c027c546a05658fba93aeaea5042b12d50b93d31a5d156", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:44240", + "10.65.0.27:44240", + "172.17.0.1:44240", + "172.18.0.1:44240", + "172.19.0.1:44240" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "tailscale.com/cap/drive": [{ "shares": ["*"], "access": "rw" }] } + } + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.85.66.106", "fd7a:115c:a1e0::7c37:426a"], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::1737:7960/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.85.66.106", "fd7a:115c:a1e0::7c37:426a"], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::9e37:5a52/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.85.66.106", "fd7a:115c:a1e0::7c37:426a"], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "tailscale.com/cap/drive-sharer", "Values": null }, + { "Dst": "fd7a:115c:a1e0::2d01:c747/128", "Cap": "tailscale.com/cap/drive-sharer", "Values": null } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": { "tailscale.com/cap/drive-sharer": null } + } + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V20.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V20.json new file mode 100644 index 00000000..791989b3 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V20.json @@ -0,0 +1,755 @@ +{ + "test_id": "GRANT-V20", + "timestamp": "2026-02-23T15:41:34Z", + "propagation_wait_seconds": 8, + "input": { + "policy_file": "grant_policies_v2/grant_v20.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["tag:router"], + "app": { + "tailscale.com/cap/kubernetes": [ + { + "impersonate": { + "groups": ["system:masters"] + } + } + ] + } + } + ] + }, + "grants_section": [ + { + "src": ["autogroup:member"], + "dst": ["tag:router"], + "app": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "100.103.90.82", + "100.110.121.96", + "100.90.199.68", + "fd7a:115c:a1e0::1737:7960", + "fd7a:115c:a1e0::2d01:c747", + "fd7a:115c:a1e0::9e37:5a52" + ], + "CapGrant": [ + { + "Dsts": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "100.103.90.82/32", + "100.110.121.96/32", + "100.90.199.68/32", + "fd7a:115c:a1e0::1737:7960/128", + "fd7a:115c:a1e0::2d01:c747/128", + "fd7a:115c:a1e0::9e37:5a52/128" + ], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { + "Dst": "100.92.142.61/32", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + }, + { + "Dst": "fd7a:115c:a1e0::3e37:8e3d/128", + "Cap": "tailscale.com/cap/kubernetes", + "Values": [{ "impersonate": { "groups": ["system:masters"] } }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:9841ea823abefc7197a67b2b33ba551868a344e64ecd27e00d1a100e5e9e5427", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:42311", + "10.65.0.27:42311", + "172.17.0.1:42311", + "172.18.0.1:42311", + "172.19.0.1:42311" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:733598f0f74431b5b2b28fb5980d8b2f79b5ca5524664998d1d011a651643211", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:50398", + "10.65.0.27:50398", + "172.17.0.1:50398", + "172.18.0.1:50398", + "172.19.0.1:50398" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:203d3bfbd67a06d210c027c546a05658fba93aeaea5042b12d50b93d31a5d156", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:44240", + "10.65.0.27:44240", + "172.17.0.1:44240", + "172.18.0.1:44240", + "172.19.0.1:44240" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": { "tailscale.com/cap/kubernetes": [{ "impersonate": { "groups": ["system:masters"] } }] } + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V21.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V21.json new file mode 100644 index 00000000..894844ff --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V21.json @@ -0,0 +1,1020 @@ +{ + "test_id": "GRANT-V21", + "timestamp": "2026-02-23T15:41:43Z", + "propagation_wait_seconds": 8, + "input": { + "policy_file": "grant_policies_v2/grant_v21.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["10.33.0.0/16"], + "via": ["tag:router", "tag:exit"], + "ip": ["*"] + } + ] + }, + "grants_section": [{ "src": ["*"], "dst": ["10.33.0.0/16"], "via": ["tag:router", "tag:exit"], "ip": ["*"] }], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [{ "IP": "10.33.0.0/16", "Ports": { "First": 0, "Last": 65535 } }] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [{ "Net": "10.33.0.0/16", "Ports": { "First": 0, "Last": 65535 } }], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:7e9099516456f84f9af01c51ce03bc38764c4c02bf6c73a6d4b2495771a6c449", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:47452", + "10.65.0.27:47452", + "172.17.0.1:47452", + "172.18.0.1:47452", + "172.19.0.1:47452" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:2dd2ca7f9f1378d3ec23a7d6ba57a735032f9a4f90b6c95b2c2385950ec7ae45", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:54907", + "10.65.0.27:54907", + "172.17.0.1:54907", + "172.18.0.1:54907", + "172.19.0.1:54907" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:9f71ff1e1652916263ef05d0a5e9d9e18239aa598f956b24c563c03a1088cb39", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:34495", + "10.65.0.27:34495", + "172.17.0.1:34495", + "172.18.0.1:34495", + "172.19.0.1:34495" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:9841ea823abefc7197a67b2b33ba551868a344e64ecd27e00d1a100e5e9e5427", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:42311", + "10.65.0.27:42311", + "172.17.0.1:42311", + "172.18.0.1:42311", + "172.19.0.1:42311" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:733598f0f74431b5b2b28fb5980d8b2f79b5ca5524664998d1d011a651643211", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:50398", + "10.65.0.27:50398", + "172.17.0.1:50398", + "172.18.0.1:50398", + "172.19.0.1:50398" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:203d3bfbd67a06d210c027c546a05658fba93aeaea5042b12d50b93d31a5d156", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:44240", + "10.65.0.27:44240", + "172.17.0.1:44240", + "172.18.0.1:44240", + "172.19.0.1:44240" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V22.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V22.json new file mode 100644 index 00000000..6dd281d7 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V22.json @@ -0,0 +1,62 @@ +{ + "test_id": "GRANT-V22", + "description": "", + "timestamp": "2026-02-23T15:41:52Z", + "error": true, + "input": { + "policy_file": "grant_policies_v2/grant_v22.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["autogroup:internet"], + "ip": ["tcp:443"], + "app": { + "example.com/cap/internet-mixed": [ + { + "proxy": "yes" + } + ] + } + } + ] + }, + "grants_section": [ + { + "src": ["autogroup:member"], + "dst": ["autogroup:internet"], + "ip": ["tcp:443"], + "app": { "example.com/cap/internet-mixed": [{ "proxy": "yes" }] } + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "cannot use app grants with autogroup:internet" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V23.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V23.json new file mode 100644 index 00000000..8621ad1e --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V23.json @@ -0,0 +1,1031 @@ +{ + "test_id": "GRANT-V23", + "timestamp": "2026-02-23T15:41:53Z", + "propagation_wait_seconds": 8, + "input": { + "policy_file": "grant_policies_v2/grant_v23.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["*"], + "dst": ["10.33.0.0/16"], + "via": ["tag:router"], + "ip": ["tcp:22", "tcp:80", "tcp:443"] + } + ] + }, + "grants_section": [ + { "src": ["*"], "dst": ["10.33.0.0/16"], "via": ["tag:router"], "ip": ["tcp:22", "tcp:80", "tcp:443"] } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": [ + "10.33.0.0/16", + "100.115.94.0-100.127.255.255", + "100.64.0.0-100.115.91.255", + "fd7a:115c:a1e0::/48" + ], + "DstPorts": [ + { "IP": "10.33.0.0/16", "Ports": { "First": 22, "Last": 22 } }, + { "IP": "10.33.0.0/16", "Ports": { "First": 80, "Last": 80 } }, + { "IP": "10.33.0.0/16", "Ports": { "First": 443, "Last": 443 } } + ], + "IPProto": [6] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6], + "Srcs": [ + "10.33.0.0/16", + "100.115.94.0/23", + "100.115.96.0/19", + "100.115.128.0/17", + "100.116.0.0/14", + "100.120.0.0/13", + "100.64.0.0/11", + "100.96.0.0/12", + "100.112.0.0/15", + "100.114.0.0/16", + "100.115.0.0/18", + "100.115.64.0/20", + "100.115.80.0/21", + "100.115.88.0/22", + "fd7a:115c:a1e0::/48" + ], + "SrcCaps": null, + "Dsts": [ + { "Net": "10.33.0.0/16", "Ports": { "First": 22, "Last": 22 } }, + { "Net": "10.33.0.0/16", "Ports": { "First": 80, "Last": 80 } }, + { "Net": "10.33.0.0/16", "Ports": { "First": 443, "Last": 443 } } + ], + "Caps": [] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": { + "Node": { + "ID": 4041918547170221, + "StableID": "ngCb76MbZY11CNTRL", + "Name": "exit-node.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:90f4a7b9dc024f1ddec414a49de2aa7611a2dd86efc9d7bae30862ad7c954269", + "DiscoKey": "discokey:701f9ed9296436d3251a9d00d061859edb5ee55602bc0ecf7c64330adc77c815", + "Addresses": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "AllowedIPs": ["100.85.66.106/32", "fd7a:115c:a1e0::7c37:426a/128"], + "Endpoints": [ + "77.164.248.136:47924", + "10.65.0.27:47924", + "172.17.0.1:47924", + "172.18.0.1:47924", + "172.19.0.1:47924" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "exit-node", + "Services": [ + { "Proto": "peerapi4", "Port": 37000 }, + { "Proto": "peerapi6", "Port": 37000 } + ] + }, + "Created": "2026-02-23T00:13:20.566112173Z", + "Cap": 131, + "Tags": ["tag:exit"], + "Online": true, + "ComputedName": "exit-node", + "ComputedNameWithHost": "exit-node" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": { + "Node": { + "ID": 4031348162889210, + "StableID": "nf7BTTgoUY11CNTRL", + "Name": "tagged-client.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:3011e53353e49142ea56ae11f81e0dceae0d667093d04ee086dcb1e9c5d3c844", + "DiscoKey": "discokey:7e9099516456f84f9af01c51ce03bc38764c4c02bf6c73a6d4b2495771a6c449", + "Addresses": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "AllowedIPs": ["100.83.200.69/32", "fd7a:115c:a1e0::c537:c845/128"], + "Endpoints": [ + "77.164.248.136:47452", + "10.65.0.27:47452", + "172.17.0.1:47452", + "172.18.0.1:47452", + "172.19.0.1:47452" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-client", + "Services": [ + { "Proto": "peerapi4", "Port": 41378 }, + { "Proto": "peerapi6", "Port": 41378 } + ] + }, + "Created": "2026-02-23T00:13:11.017324028Z", + "Cap": 131, + "Tags": ["tag:client"], + "Online": true, + "ComputedName": "tagged-client", + "ComputedNameWithHost": "tagged-client" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": { + "Node": { + "ID": 301794218943819, + "StableID": "neJag6dgM311CNTRL", + "Name": "tagged-prod.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:54c79503322a5d0a9701ce19d11963cfff9c05667ac06ef976af86275ba7080e", + "DiscoKey": "discokey:2dd2ca7f9f1378d3ec23a7d6ba57a735032f9a4f90b6c95b2c2385950ec7ae45", + "Addresses": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "AllowedIPs": ["100.103.8.15/32", "fd7a:115c:a1e0::5b37:80f/128"], + "Endpoints": [ + "77.164.248.136:54907", + "10.65.0.27:54907", + "172.17.0.1:54907", + "172.18.0.1:54907", + "172.19.0.1:54907" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-prod", + "Services": [ + { "Proto": "peerapi4", "Port": 37678 }, + { "Proto": "peerapi6", "Port": 37678 } + ] + }, + "Created": "2026-02-20T14:03:12.89283153Z", + "Cap": 131, + "Tags": ["tag:prod"], + "Online": true, + "ComputedName": "tagged-prod", + "ComputedNameWithHost": "tagged-prod" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": { + "Node": { + "ID": 1440249486084758, + "StableID": "nXRbBtuHFC11CNTRL", + "Name": "tagged-server.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:7d5c34b3e8082069d0a82838165c33f8e1b5eb32c6211c2d23d4fe8fb9ec4a19", + "DiscoKey": "discokey:9f71ff1e1652916263ef05d0a5e9d9e18239aa598f956b24c563c03a1088cb39", + "Addresses": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "AllowedIPs": ["100.108.74.26/32", "fd7a:115c:a1e0::b901:4a87/128"], + "Endpoints": [ + "77.164.248.136:34495", + "10.65.0.27:34495", + "172.17.0.1:34495", + "172.18.0.1:34495", + "172.19.0.1:34495" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "tagged-server", + "Services": [ + { "Proto": "peerapi4", "Port": 46499 }, + { "Proto": "peerapi6", "Port": 46499 } + ] + }, + "Created": "2026-01-23T10:10:26.365653609Z", + "Cap": 131, + "Tags": ["tag:server"], + "Online": true, + "ComputedName": "tagged-server", + "ComputedNameWithHost": "tagged-server" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": { + "Node": { + "ID": 7728836216590060, + "StableID": "nf4dJTRQM321CNTRL", + "Name": "user-kris.tail78f774.ts.net.", + "User": 4538565228176803, + "Key": "nodekey:40d0f8f49fd519e4a4a2b7d278dcc8863254d4fb8b0219f1d1304cdd172e795f", + "KeyExpiry": "2026-08-19T14:09:34Z", + "DiscoKey": "discokey:9841ea823abefc7197a67b2b33ba551868a344e64ecd27e00d1a100e5e9e5427", + "Addresses": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "AllowedIPs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "Endpoints": [ + "77.164.248.136:42311", + "10.65.0.27:42311", + "172.17.0.1:42311", + "172.18.0.1:42311", + "172.19.0.1:42311" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-kris", + "Services": [ + { "Proto": "peerapi4", "Port": 40159 }, + { "Proto": "peerapi6", "Port": 40159 } + ] + }, + "Created": "2026-02-20T14:09:34.803901523Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-kris", + "ComputedNameWithHost": "user-kris" + }, + "UserProfile": { "ID": 4538565228176803, "LoginName": "kristoffer@dalby.cc", "DisplayName": "kristoffer" }, + "CapMap": null + } + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": { + "Node": { + "ID": 1840115676059256, + "StableID": "nFzZ7giPNF11CNTRL", + "Name": "user-mon.tail78f774.ts.net.", + "User": 3982058329734709, + "Key": "nodekey:1ca6cca66d2b3811ec290c2f7ac30125c3568e19e303a8e30f6b165c9ee75a51", + "KeyExpiry": "2026-08-19T14:09:00Z", + "DiscoKey": "discokey:733598f0f74431b5b2b28fb5980d8b2f79b5ca5524664998d1d011a651643211", + "Addresses": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "AllowedIPs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "Endpoints": [ + "77.164.248.136:50398", + "10.65.0.27:50398", + "172.17.0.1:50398", + "172.18.0.1:50398", + "172.19.0.1:50398" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user-mon", + "Services": [ + { "Proto": "peerapi4", "Port": 33201 }, + { "Proto": "peerapi6", "Port": 33201 } + ] + }, + "Created": "2026-02-20T14:09:00.203639664Z", + "Cap": 131, + "Online": true, + "ComputedName": "user-mon", + "ComputedNameWithHost": "user-mon" + }, + "UserProfile": { + "ID": 3982058329734709, + "LoginName": "monitorpasskeykradalby@passkey", + "DisplayName": "monitorpasskeykradalby" + }, + "CapMap": null + } + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": { + "Node": { + "ID": 539541576444929, + "StableID": "nSq9YrqMD511CNTRL", + "Name": "user1.tail78f774.ts.net.", + "User": 4156223528223174, + "Key": "nodekey:96338a2cd2ea803c915ed8fdf882d66ca0c6a59d0fcf0bc4b3f928d22d1ac743", + "KeyExpiry": "2026-07-22T10:04:13Z", + "DiscoKey": "discokey:203d3bfbd67a06d210c027c546a05658fba93aeaea5042b12d50b93d31a5d156", + "Addresses": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "AllowedIPs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "Endpoints": [ + "77.164.248.136:44240", + "10.65.0.27:44240", + "172.17.0.1:44240", + "172.18.0.1:44240", + "172.19.0.1:44240" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "user1", + "Services": [ + { "Proto": "peerapi4", "Port": 46708 }, + { "Proto": "peerapi6", "Port": 46708 } + ] + }, + "Created": "2026-01-23T10:04:13.531671894Z", + "Cap": 131, + "Online": true, + "ComputedName": "user1", + "ComputedNameWithHost": "user1" + }, + "UserProfile": { "ID": 4156223528223174, "LoginName": "kratail2tid@passkey", "DisplayName": "kratail2tid" }, + "CapMap": null + } + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": { + "Node": { + "ID": 7489538288452506, + "StableID": "nTPEqJU2V121CNTRL", + "Name": "subnet-router.tail78f774.ts.net.", + "User": 1260082990019555, + "Key": "nodekey:887ae2351c09c3b952f1f42bdac4095ec396ebf15824a746e4193c003e9c8e3c", + "DiscoKey": "discokey:9779fa96e2ddcd3dac863acc09b50304481964bfb3bccf52ff79d95bbd1a031d", + "Addresses": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128"], + "AllowedIPs": ["100.92.142.61/32", "fd7a:115c:a1e0::3e37:8e3d/128", "10.33.0.0/16"], + "Endpoints": [ + "77.164.248.136:57299", + "10.65.0.27:57299", + "172.17.0.1:57299", + "172.18.0.1:57299", + "172.19.0.1:57299" + ], + "HomeDERP": 14, + "Hostinfo": { + "OS": "linux", + "Hostname": "subnet-router", + "Services": [ + { "Proto": "peerapi4", "Port": 63250 }, + { "Proto": "peerapi6", "Port": 63250 } + ] + }, + "Created": "2026-02-23T00:13:15.731478784Z", + "Cap": 131, + "Tags": ["tag:router"], + "PrimaryRoutes": ["10.33.0.0/16"], + "Online": true, + "ComputedName": "subnet-router", + "ComputedNameWithHost": "subnet-router" + }, + "UserProfile": { "ID": 1260082990019555, "LoginName": "tagged-devices", "DisplayName": "Tagged Devices" }, + "CapMap": null + } + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V24.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V24.json new file mode 100644 index 00000000..59ded751 --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V24.json @@ -0,0 +1,52 @@ +{ + "test_id": "GRANT-V24", + "description": "", + "timestamp": "2026-02-23T15:42:03Z", + "error": true, + "input": { + "policy_file": "grant_policies_v2/grant_v24.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["tag:server"], + "dst": ["autogroup:self"], + "app": { + "example.com/cap/self-cap": [{}] + } + } + ] + }, + "grants_section": [ + { "src": ["tag:server"], "dst": ["autogroup:self"], "app": { "example.com/cap/self-cap": [{}] } } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 400, + "api_response_body": { "message": "autogroup:self can only be used with users, groups, or supported autogroups" } + } +} diff --git a/hscontrol/policy/v2/testdata/grant_results/GRANT-V25.json b/hscontrol/policy/v2/testdata/grant_results/GRANT-V25.json new file mode 100644 index 00000000..1372c2ca --- /dev/null +++ b/hscontrol/policy/v2/testdata/grant_results/GRANT-V25.json @@ -0,0 +1,571 @@ +{ + "test_id": "GRANT-V25", + "timestamp": "2026-02-23T15:42:04Z", + "propagation_wait_seconds": 8, + "input": { + "policy_file": "grant_policies_v2/grant_v25.json", + "full_policy": { + "groups": { + "group:admins": ["kratail2tid@passkey"], + "group:developers": ["kristoffer@dalby.cc", "kratail2tid@passkey"], + "group:monitors": ["monitorpasskeykradalby@passkey"], + "group:empty": [] + }, + "tagOwners": { + "tag:server": ["kratail2tid@passkey"], + "tag:prod": ["kratail2tid@passkey"], + "tag:client": ["kratail2tid@passkey"], + "tag:router": ["kratail2tid@passkey"], + "tag:exit": ["kratail2tid@passkey"] + }, + "hosts": { + "webserver": "100.108.74.26", + "prodbox": "100.103.8.15", + "internal": "10.0.0.0/8" + }, + "autoApprovers": { + "routes": { + "10.33.0.0/16": ["tag:router"], + "0.0.0.0/0": ["tag:exit"], + "::/0": ["tag:exit"] + } + }, + "grants": [ + { + "src": ["autogroup:member"], + "dst": ["autogroup:self"], + "app": { + "example.com/cap/self-test": [ + { + "level": "basic" + } + ] + } + } + ] + }, + "grants_section": [ + { + "src": ["autogroup:member"], + "dst": ["autogroup:self"], + "app": { "example.com/cap/self-test": [{ "level": "basic" }] } + } + ], + "api_endpoint": "https://api.tailscale.com/api/v2/tailnet/kratail2tid%40passkey/acl", + "api_method": "POST", + "api_response_code": 200 + }, + "topology": { + "nodes": { + "exit-node": { + "mts_name": "exit-node", + "socket": "/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock", + "hostname": "exit-node", + "user_id": 4041918547170221, + "tags": ["tag:exit"], + "ipv4": "100.85.66.106", + "ipv6": "fd7a:115c:a1e0::7c37:426a" + }, + "subnet-router": { + "mts_name": "subnet-router", + "socket": "/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock", + "hostname": "subnet-router", + "user_id": 7489538288452506, + "tags": ["tag:router"], + "ipv4": "100.92.142.61", + "ipv6": "fd7a:115c:a1e0::3e37:8e3d" + }, + "tagged-client": { + "mts_name": "tagged-client", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock", + "hostname": "tagged-client", + "user_id": 4031348162889210, + "tags": ["tag:client"], + "ipv4": "100.83.200.69", + "ipv6": "fd7a:115c:a1e0::c537:c845" + }, + "tagged-prod": { + "mts_name": "tagged-prod", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock", + "hostname": "tagged-prod", + "user_id": 301794218943819, + "tags": ["tag:prod"], + "ipv4": "100.103.8.15", + "ipv6": "fd7a:115c:a1e0::5b37:80f" + }, + "tagged-server": { + "mts_name": "tagged-server", + "socket": "/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock", + "hostname": "tagged-server", + "user_id": 1440249486084758, + "tags": ["tag:server"], + "ipv4": "100.108.74.26", + "ipv6": "fd7a:115c:a1e0::b901:4a87" + }, + "user-kris": { + "mts_name": "user-kris", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock", + "hostname": "user-kris", + "user_id": 4538565228176803, + "tags": [], + "ipv4": "100.110.121.96", + "ipv6": "fd7a:115c:a1e0::1737:7960" + }, + "user-mon": { + "mts_name": "user-mon", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock", + "hostname": "user-mon", + "user_id": 3982058329734709, + "tags": [], + "ipv4": "100.103.90.82", + "ipv6": "fd7a:115c:a1e0::9e37:5a52" + }, + "user1": { + "mts_name": "user1", + "socket": "/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock", + "hostname": "user1", + "user_id": 4156223528223174, + "tags": [], + "ipv4": "100.90.199.68", + "ipv6": "fd7a:115c:a1e0::2d01:c747" + } + } + }, + "captures": { + "exit-node": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/exit-node/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "subnet-router": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/subnet-router/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-client": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-client/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-prod": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-prod/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "tagged-server": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": null, + "packet_filter_matches": [], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/tagged-server/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-kris": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.110.121.96", "fd7a:115c:a1e0::1737:7960"], + "CapGrant": [ + { + "Dsts": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "CapMap": { "example.com/cap/self-test": [{ "level": "basic" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.110.121.96/32", "fd7a:115c:a1e0::1737:7960/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.110.121.96/32", "Cap": "example.com/cap/self-test", "Values": [{ "level": "basic" }] }, + { + "Dst": "fd7a:115c:a1e0::1737:7960/128", + "Cap": "example.com/cap/self-test", + "Values": [{ "level": "basic" }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.103.90.82", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-kris/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user-mon": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.103.90.82", "fd7a:115c:a1e0::9e37:5a52"], + "CapGrant": [ + { + "Dsts": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "CapMap": { "example.com/cap/self-test": [{ "level": "basic" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.103.90.82/32", "fd7a:115c:a1e0::9e37:5a52/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.103.90.82/32", "Cap": "example.com/cap/self-test", "Values": [{ "level": "basic" }] }, + { + "Dst": "fd7a:115c:a1e0::9e37:5a52/128", + "Cap": "example.com/cap/self-test", + "Values": [{ "level": "basic" }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.90.199.68": { + "peer_name": "user1", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user-mon/tailscaled.sock whois --json 100.90.199.68", + "response": null + } + } + }, + "user1": { + "commands": { + "packet_filter_rules": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-rules", + "packet_filter_matches": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock debug localapi POST debug-packet-filter-matches" + }, + "packet_filter_rules": [ + { + "SrcIPs": ["100.90.199.68", "fd7a:115c:a1e0::2d01:c747"], + "CapGrant": [ + { + "Dsts": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "CapMap": { "example.com/cap/self-test": [{ "level": "basic" }] } + } + ] + } + ], + "packet_filter_matches": [ + { + "IPProto": [6, 17, 1, 58], + "Srcs": ["100.90.199.68/32", "fd7a:115c:a1e0::2d01:c747/128"], + "SrcCaps": null, + "Dsts": [], + "Caps": [ + { "Dst": "100.90.199.68/32", "Cap": "example.com/cap/self-test", "Values": [{ "level": "basic" }] }, + { + "Dst": "fd7a:115c:a1e0::2d01:c747/128", + "Cap": "example.com/cap/self-test", + "Values": [{ "level": "basic" }] + } + ] + } + ], + "whois": { + "100.85.66.106": { + "peer_name": "exit-node", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.85.66.106", + "response": null + }, + "100.92.142.61": { + "peer_name": "subnet-router", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.92.142.61", + "response": null + }, + "100.83.200.69": { + "peer_name": "tagged-client", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.83.200.69", + "response": null + }, + "100.103.8.15": { + "peer_name": "tagged-prod", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.8.15", + "response": null + }, + "100.108.74.26": { + "peer_name": "tagged-server", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.108.74.26", + "response": null + }, + "100.110.121.96": { + "peer_name": "user-kris", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.110.121.96", + "response": null + }, + "100.103.90.82": { + "peer_name": "user-mon", + "command": "/home/kradalby/go/bin/tailscale --socket=/home/kradalby/.config/multi-tailscale-dev/user1/tailscaled.sock whois --json 100.103.90.82", + "response": null + } + } + } + } +}